如何编写匹配单引号但排除紧邻大括号情况的正则表达式?
解决单引号匹配问题的正则表达式
你之前的正则逻辑存在问题:(?!'{|'})|(?!{'|}') 使用了逻辑或,负向断言的条件等价于“只要不是'{或'},或者不是{'或}'”,这几乎会匹配所有单引号,因为很少有单引号同时满足两种排除条件。
要实现“匹配不紧邻大括号的单引号”,需要同时限制单引号的前一个字符不是},且后一个字符不是{,用负向后顾和负向先行断言组合即可:
支持后顾断言的正则引擎(Python、Java、C#、现代JS等)
(?<!})'(?!{)
表达式拆解:
(?<!}):负向后顾断言,确保当前单引号的前一个字符不是}':匹配目标单引号(?!{):负向先行断言,确保当前单引号的后一个字符不是{
测试验证
匹配场景(符合预期):
xyz 'bla → 匹配此处的' 12' foo → 匹配此处的' 'abc → 匹配此处的' '' → 两个'都会被匹配(第一个'后是'而非{,第二个'前是'而非}) '%$=' → 匹配此处的'
不匹配场景(符合预期):
'{ → 不匹配('后紧跟{) }' → 不匹配('前紧跟}) '{' → 不匹配('后紧跟{) }' → 不匹配('前紧跟})
兼容无后顾断言的旧版引擎(如ES2018之前的JS)
如果你的环境不支持负向后顾,可以用以下写法,通过匹配前后上下文间接排除:
(?:^|[^}])'(?!{)|'(?![{])(?:[^}]|$)
这个表达式会匹配两种情况:
- 单引号前是行首或非
}字符,且后不是{ - 单引号后不是
{,且后是行尾或非}字符
内容的提问来源于stack exchange,提问作者witchi
相关产品推荐
相关产品推荐

