.net - .NET 正则表达式 "\19abc"匹配什么?

标签 .net regex octal backreference

我正在学习.NET 正则表达式。 众所周知,八进制转义码(例如\16)和\number 反向引用之间存在歧义。 https://msdn.microsoft.com/en-us/library/thwdfzxy.aspx

我的问题是: 当正则表达式模式中未定义具有该数字的组时,\19\288 等正则表达式会匹配什么?

它既不是有效的组号,也不是有效的八进制代码。 但它是一个有效的正则表达式(甚至 \14848486 也是有效的) - Regex 构造函数不会抛出 ArgumentException,但我找不到任何与此类转义序列匹配的输入字符串。

我只是好奇如何解释一个表达式。

最佳答案

当解析一个模式有多种可能性时,就会出现歧义。比如说,在具有 10 个捕获组的 (.)(.)(.)(.)(.)(.)(.)(.)(.)(.)\10 模式中,我们可以说存在歧义,因为 110 都可以引用现有组,但 .NET 正则表达式引擎将这种歧义解析为最大可能的值,并且此正则表达式 won't match 12345678901 , but will match 12345678900 。为了消除歧义,您需要使用 \k<ID> 反向引用。 (.)(.)(.)(.)(.)(.)(.)(.)(.)(.)\k<1>0 将匹配 123456789010 ,但不匹配 123456789000

\14848486 模式匹配八进制 14 字符,然后匹配 848486 序列,因为这里没有歧义。

\18848486 模式将匹配八进制 1 字符,然后匹配 8848486 字符序列。请参阅 this C# demo:

var s = Regex.Match("\u00018848486", @"\18848486");
if (s.Success) Console.WriteLine(s.Value); // => 8848486

我还建议使用 Ultrapico Expresso(无隶属关系)来调试 .NET 正则表达式,请参阅屏幕截图:

enter image description here

对于\19\288:

enter image description here

此外,当您使用对缺少的组的反向引用时(如 \k<1>8848486 中所示),您将使用 will get a System.ArgumentException: parsing '\k<1>8848486' - Reference to undefined group number N exception 。当您在 8 之后有 9\ 时(如 \8848486 中所示),您将得到 System.ArgumentException: parsing '\8848486' - Unrecognized escape sequence N exception

关于.net - .NET 正则表达式 "\19abc"匹配什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41600856/

相关文章:

c# - 无法解析来自 Yahoo! 的 xml梦幻体育与 C#

regex - 如何优化 grep 正则表达式以匹配 URL

C# 正则表达式模式获取单词

java - 字符串的八进制值

Java int除法让我困惑

c# - Visual Studio 自动命名空间更改

c# - 当鼠标悬停在 ScrollViewer 上时,为什么我的 WPF 样式触发器无法仅显示水平滚动条?

c# - 在 DataGridView 中处理 TextBox 中的导航键

javascript - 用 html 按钮替换字符串中的自定义标记

python - 正则表达式和八进制字符