Javascript 如果字符匹配,正则表达式将使用该字符,否则不使用
我正在尝试编写一个正则表达式,它将捕获“@”字符的所有实例,除非两个这样的字符连续出现(本质上是转义序列)。例如:Javascript 如果字符匹配,正则表达式将使用该字符,否则不使用,javascript,regex,regex-lookarounds,Javascript,Regex,Regex Lookarounds,我正在尝试编写一个正则表达式,它将捕获“@”字符的所有实例,除非两个这样的字符连续出现(本质上是转义序列)。例如: abd@ajk:@应该匹配 abd@@ajk:没有匹配项 abd@@@ajk:最后的@应该匹配 abd@@@ajk:没有匹配项 这几乎适用于负前瞻表达式@(?!@),但由于第二个@未被使用,因此两个@符号中的最后一个符号仍将匹配。我想我要做的是向前看一个@,但如果它在那里,就使用它;否则,不要食用它。这可能吗 编辑:我正在使用Javascript,不幸的是它排除了几种好的方法:(在
abd@ajk
:@
应该匹配
abd@@ajk
:没有匹配项
abd@@@ajk
:最后的@
应该匹配
abd@@@ajk
:没有匹配项
这几乎适用于负前瞻表达式@(?!@)
,但由于第二个@
未被使用,因此两个@
符号中的最后一个符号仍将匹配。我想我要做的是向前看一个@
,但如果它在那里,就使用它;否则,不要食用它。这可能吗
编辑:我正在使用Javascript,不幸的是它排除了几种好的方法:(在Javascript中,要在未转义的
@
处分割字符串,实际上可以匹配@
(转义的@
)文本块和@
以外的任何字符:
var strs=[]abd@ajk“,'abd@@@ajk','abd@@@ajk','abd@@@ajk'];
变量rx=/(?:[^@]|@)+/g;
用于(STR的var s){
console.log(s,“=>”,s.match(rx))
}
在JavaScript中,要在未转义的@
处拆分字符串,实际上可以匹配@
(转义的@
)文本块和@
以外的任何字符:
var strs=[]abd@ajk“,'abd@@@ajk','abd@@@ajk','abd@@@ajk'];
变量rx=/(?:[^@]|@)+/g;
用于(STR的var s){
console.log(s,“=>”,s.match(rx))
}
既然您的问题中没有添加编程语言,那么这里是我的Java 2美分:
(?<=(?<!@)(?:@@){0,999})@(?!@)
匹配出现的(?:[^@]*(?:@)+[^@]*)+
及其所有前导/尾随字符@
或单个|@
@
str.split(/((?:[^@]*(?:@@)+[^@]*)+)|@/).filter(Boolean);
方法2(推荐)
或者,如果您在使用match()
时没有问题,这会更干净,当然也更快:
(?:[^@]*(?:@@)+[^@]*)+|[^@]+
JS代码:
str.split(/((?:[^@]*(?:@@)+[^@]*)+)|@/).filter(Boolean);
console.log(
“aaaa@@@@@@@bbb@aa@@@匹配(/(?:[^@]*(?:@)+[^@]*)+|[^@]+/g)
)
既然您的问题中没有添加编程语言,那么这里是我的Java 2美分:
(?<=(?<!@)(?:@@){0,999})@(?!@)
匹配出现的(?:[^@]*(?:@)+[^@]*)+
及其所有前导/尾随字符@
或单个|@
@
str.split(/((?:[^@]*(?:@@)+[^@]*)+)|@/).filter(Boolean);
方法2(推荐)
或者,如果您在使用match()
时没有问题,这会更干净,当然也更快:
(?:[^@]*(?:@@)+[^@]*)+|[^@]+
JS代码:
str.split(/((?:[^@]*(?:@@)+[^@]*)+)|@/).filter(Boolean);
console.log(
“aaaa@@@@@@@bbb@aa@@@匹配(/(?:[^@]*(?:@)+[^@]*)+|[^@]+/g)
)
是否替换或匹配?语言是什么?请尝试另一种解决方案@(*SKIP)(?!)|@
Java解决方案将是(?如果您计划“退出”未替换的@
,您可以使用。是否替换或匹配?语言是什么?请尝试另一种解决方案@(*SKIP)(?)|@
一个Java解决方案是(?如果您计划“转义”未转义的@
,您可以使用。