我正在尝试编写一个正则表达式表达式,该表达式将捕获'@'字符的所有实例,除非两个这样的字符连续出现(本质上是转义序列)。例如:abd@ajk
:@
应该匹配abd@@ajk
:没有匹配项abd@@@ajk
:最终的@
应该匹配。abd@@@@ajk
:没有匹配项
这几乎可以与否定的超前表达式@(?!@)
一起使用,除了因为不使用第二个@
之外,两个@
符号中的最后一个仍将匹配。我想我想做的就是提前查找@
,但是如果存在该字符,就将其消耗掉。否则,请勿食用。这可能吗?
编辑:我使用的Javascript不幸地排除了几种好的方法:(
最佳答案
在JavaScript中,要在未转义的@
处分割字符串,实际上可以匹配@@
(转义的@
)和除@
以外的任何字符的文本块:
var strs = ['abd@ajk','abd@@ajk','abd@@@ajk','abd@@@@ajk'];
var rx = /(?:[^@]|@@)+/g;
for (var s of strs) {
console.log(s, "=>", s.match(rx))
}
正则表达式是
/(?:[^@]|@@)+/g
见its demo
细节
(?:
-与两个备选方案之一匹配的非捕获组的开始:[^ @]
- any char other than
@`|
-或@@
-2 @
秒)+
-重复匹配1次或更多次。g
修饰符查找输入字符串中所有匹配的出现。