【问题标题】: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)(?

不匹配。我究竟做错了什么?请帮忙。

【问题讨论】:

    标签: .net regex


    【解决方案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。你能告诉我一些网址吗? (我不是程序员,但我想了解背后的原因)。最后:在某些字符串后面查找,其中后面的匹配肯定在匹配的字符串之前,即使在大多数情况下感觉不到,也会花费更长的时间来运行。与零次 (*​​) 相同,我喜欢尽可能避免它,以便更快地运行 + 在可能的情况下涉及一些其他逻辑。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-12
    • 1970-01-01
    • 1970-01-01
    • 2020-05-11
    • 1970-01-01
    • 2016-02-20
    相关资源
    最近更新 更多