c#中的正则表达式,负向后看的表达式

本文关键字:表达式 正则表达式 | 更新日期: 2023-09-27 17:50:13

我想写一个表达式来匹配前面有奇数个问号的单引号。

我发现了一个否定的向后看表达式来匹配单个问号

pattern (?<!'?)'
aaa?'aaa   match
aaa'aaaa   not match
aaa??'aaa  match --wrong

但是我需要的是检测奇数个问号,而不仅仅是一个。
我试着把它像(?<!'?(??))'一样,但它不起作用。

我要的结果是

aaa?'aaaa  match
aaa??'aaaa  not match
aaa???'aaaa  match
aaa????'aaaa  not match
aaa?????'aaaa  match

c#中的正则表达式,负向后看的表达式

您要查找的正则表达式是(?<=(^|[^?])('?'?)*'?)'

让我们打破后面的lookbehind(我把它改成了正的):

(^|[^?]) not a question mark (possibly also start of string, i.e. nothing)
('?'?)*  any number of question mark pairs
'?       a single question mark

因此,为了使引号匹配,必须在其前面按相反顺序放置这些标记。很明显,对于某些N>= 0,这将强制前面问号的数量恰好为2N + 1。

我认为您不需要使用任何查找来进行此匹配。试试这个:

([^'?]|^)'?('?'?)*([^'?]|$)

检查?符号是否在非问号符号之间或在字符串开始的末尾。

虽然我不确定会发生什么输入像aaa?????'aaaa??