Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如果字符匹配,正则表达式将使用该字符,否则不使用_Javascript_Regex_Regex Lookarounds - Fatal编程技术网

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})@(?!@)
  • (?:[^@]*(?:@)+[^@]*)+
    匹配出现的
    @
    及其所有前导/尾随字符
  • |@
    或单个
    @
JS代码:

str.split(/((?:[^@]*(?:@@)+[^@]*)+)|@/).filter(Boolean);
方法2(推荐) 或者,如果您在使用
match()
时没有问题,这会更干净,当然也更快:

(?:[^@]*(?:@@)+[^@]*)+|[^@]+
JS代码:

str.split(/((?:[^@]*(?:@@)+[^@]*)+)|@/).filter(Boolean);
console.log(
“aaaa@@@@@@@bbb@aa@@@匹配(/(?:[^@]*(?:@)+[^@]*)+|[^@]+/g)

)
既然您的问题中没有添加编程语言,那么这里是我的Java 2美分:

(?<=(?<!@)(?:@@){0,999})@(?!@)
  • (?:[^@]*(?:@)+[^@]*)+
    匹配出现的
    @
    及其所有前导/尾随字符
  • |@
    或单个
    @
JS代码:

str.split(/((?:[^@]*(?:@@)+[^@]*)+)|@/).filter(Boolean);
方法2(推荐) 或者,如果您在使用
match()
时没有问题,这会更干净,当然也更快:

(?:[^@]*(?:@@)+[^@]*)+|[^@]+
JS代码:

str.split(/((?:[^@]*(?:@@)+[^@]*)+)|@/).filter(Boolean);
console.log(
“aaaa@@@@@@@bbb@aa@@@匹配(/(?:[^@]*(?:@)+[^@]*)+|[^@]+/g)

)
是否替换或匹配?语言是什么?请尝试另一种解决方案
@(*SKIP)(?!)|@
Java解决方案将是
(?如果您计划“退出”未替换的
@
,您可以使用。是否替换或匹配?语言是什么?请尝试另一种解决方案
@(*SKIP)(?)|@
一个Java解决方案是
(?如果您计划“转义”未转义的
@
,您可以使用。