使用 "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})*\+) 后视需要紧靠左侧的 +,而不是紧跟在 \ 之前,然后是任意数量的双反斜杠。