使用 "not character" 的后视忽略位置 0 处的匹配
Lookbehind with "not character" ignores match at position 0
我正在尝试将 select (%?[fFsmhd]){1,}
的正则表达式放在前面 +
而不是 \+
.
我的第一个选择是 (?<=[^\]\+)(%?[fFsmhd]){1,}
,除了位置 1 从未匹配外,它似乎可行。
测试:
+fFsmhd (problem here, does not match)
+fFsmhd (matches)
我发现这个问题的解决方法是将 [^\]
替换为嵌套的否定后视,最终得到这个令人作呕的东西:(?<=(?<!\)\+)(%?[fFsmhd]){1,}
测试:
+fFsmhd (matches)
+fFsmhd (matches)
有没有更好的方法来实现这一点,而无需 nest lookbehinds 来做一个简单的 [^\]
?
没有环顾四周,就不可能做你想做的事。实际上,您的模式存在一个缺陷:如果在 +
之前有文字 \
,它将无法匹配。您需要考虑任意数量的双反斜杠:
(?<=(?<!\)(?:\{2})*\+)(%?[fFsmhd])+
看到这个 .NET regex demo。
(?<=(?<!\)(?:\{2})*\+)
后视需要紧靠左侧的 +
,而不是紧跟在 \
之前,然后是任意数量的双反斜杠。
我正在尝试将 select (%?[fFsmhd]){1,}
的正则表达式放在前面 +
而不是 \+
.
我的第一个选择是 (?<=[^\]\+)(%?[fFsmhd]){1,}
,除了位置 1 从未匹配外,它似乎可行。
测试:
+fFsmhd (problem here, does not match)
+fFsmhd (matches)
我发现这个问题的解决方法是将 [^\]
替换为嵌套的否定后视,最终得到这个令人作呕的东西:(?<=(?<!\)\+)(%?[fFsmhd]){1,}
测试:
+fFsmhd (matches)
+fFsmhd (matches)
有没有更好的方法来实现这一点,而无需 nest lookbehinds 来做一个简单的 [^\]
?
没有环顾四周,就不可能做你想做的事。实际上,您的模式存在一个缺陷:如果在 +
之前有文字 \
,它将无法匹配。您需要考虑任意数量的双反斜杠:
(?<=(?<!\)(?:\{2})*\+)(%?[fFsmhd])+
看到这个 .NET regex demo。
(?<=(?<!\)(?:\{2})*\+)
后视需要紧靠左侧的 +
,而不是紧跟在 \
之前,然后是任意数量的双反斜杠。