积极的向后看没有按预期工作
Posted
技术标签:
【中文标题】积极的向后看没有按预期工作【英文标题】:Positive lookbehind not working as expected 【发布时间】:2015-07-30 10:27:06 【问题描述】:我在使用 .net 正则表达式匹配字符串时遇到了一点问题。 例如我有以下字符串:
II Kop 15 / 1544
我想匹配 / 字符后面的第二个数字。 此外,我只想在前面的数字后跟斜杠时匹配该数字。此外,此数字只能是 2 位或 4 位数字。
我想出了这样的东西:
(\b[0-9]2\b|\b[0-9]4\b)
它匹配 2 或 4 位数字,因为它在这里匹配 15 和 1544。 现在我正在尝试积极的向后看:
(\b[0-9]2\b|\b[0-9]4\b)(?
不匹配。我究竟做错了什么?请帮忙。
【问题讨论】:
【参考方案1】:将外观放在捕获组之前更简单。
(?<=[0-9] / )([0-9]4|[0-9]2)
.NET 中允许可变长度后视,因此您也可以将正则表达式编写为:
(?<=[0-9]\s*/\s*)([0-9]4|[0-9]2)
【讨论】:
是和不是。是的-> 我必须在表达式之前放置lookbehind。否 - ,net 正则表达式支持无限宽度后视,替换后它确实有效。我将此标记为答案,因为它对我有帮助。Second, you can't use + * ?
.NET 允许可变长度后视。
避免使用\d
,除非您想匹配 Unicode 中的数字。速记字符类\s
、\d
、\w
匹配 .NET 中的 Unicode 字符
感谢指正。我不知道.NET 支持可变长度的后视。为什么 \d 像这样匹配 Unicode 数字 \U4324。你能告诉我一些网址吗? (我不是程序员,但我想了解背后的原因)。最后:在某些字符串后面查找,其中后面的匹配肯定在匹配的字符串之前,即使在大多数情况下感觉不到,也会花费更长的时间来运行。与零次 (*) 相同,我喜欢尽可能避免它,以便更快地运行 + 在可能的情况下涉及一些其他逻辑。以上是关于积极的向后看没有按预期工作的主要内容,如果未能解决你的问题,请参考以下文章