Javascript 正则表达式中的非组
所以我知道Javascript 正则表达式中的非组,javascript,regex,Javascript,Regex,所以我知道[^A-Za-z]会匹配任何非字母的字符 有没有办法和一个团队一起做这件事?例如:(?^:&;)-将匹配非序列的任何字符序列 注意:如前所述,匹配空字符串是没有意义的,因为空字符串是不是序列的字符序列,所以我希望正则表达式匹配尽可能多的字符 例如: 在Ben&;Jerry's匹配项将是Ben和Jerry's(注意Ben之后和Jerry's之前的空格也会被捕获 注意:如果可能,请不要使用look behinds,因为我将在JS脚本中使用正则表达式,Javascript不支持l
[^A-Za-z]
会匹配任何非字母的字符
有没有办法和一个团队一起做这件事?例如:(?^:&;)
-将匹配非序列的任何字符序列代码>
注意:如前所述,匹配空字符串是没有意义的,因为空字符串是不是序列的字符序列,所以我希望正则表达式匹配尽可能多的字符
例如:
在Ben&;Jerry's
匹配项将是Ben
和Jerry's
(注意Ben
之后和Jerry's
之前的空格也会被捕获
注意:如果可能,请不要使用look behinds,因为我将在JS脚本中使用正则表达式,Javascript不支持look behinds。简单:
(.*?)(?:&)|((?!&).*)$
说明:
(.*)
:拿走一切,但不要贪婪(?:&;)
:?:
是非捕获组。您不想获取该值的组((?!&;).*)$
:获取字符串的剩余部分,该字符串不是&;
您需要的是一个与备选方案匹配的正则表达式,它只将最后一个备选方案捕获到组1中,该备选方案将呈现一个(或一个展开的版本,以获得更好的性能-如果您只有2个或3个): 见(a) 模式:
-匹配&;
和
实体
-或|
-匹配并捕获组1中不是((?:(?!&;)[\s\s])+
序列起点的任何文本块(1+字符)。因为它是用于JS的,所以需要
(或[\s]
)来匹配任何字符,包括换行符。否则,请改用[^]
(如果您只想匹配线)
var re=/&;|((?:(?!&;)[\s\s])+)/g;
var str='abc Ben&;Jerry's foobar sss&;\n\n\nsSSS&;sss&;\n\nsSSS&;sss&;sss&;sss\n&;';
var-res=[];
while((m=re.exec(str))!==null){
如果(m.index==re.lastIndex){//只对
re.lastIndex++;//展开的模式(因为它可以匹配空字符串)
}
res.push(m[1]);//仅收集捕获的文本
}
document.body.innerHTML=“BEFORE:
”+str.replace(/&/g,&;)+”;
document.body.innerHTML+=“之后:
”+res.join(“”+“”)
@anubhava修复了它。很抱歉,我弄错了。用&;
分割输入会容易得多。不幸的是,虽然分割看起来很简单,但在我的脚本中,它会使它更复杂。我的脚本的目标是防弹正则表达式,其中要匹配的字符串将不包含任何&
,而是继续ly&;
s,在这一点之后有点复杂,但拆分不会奏效。@anubhava我需要一个解决方案来修复正则表达式,而不是脚本求反对于一般正则表达式来说是很棘手的。毕竟,空字符串是“一个不是&;
的字符序列”。我想你想要的是“尽可能多的字符序列,不包括&;
"。如果没有字符,只有空格,空格将不匹配…但是非常好的解决方案。谢谢。你为什么需要空格。如果你喜欢答案,你能接受吗?而且…Ben&;Jerry的
不匹配。我还不能接受。解决方案对我的scr来说不够好ipt。我需要它更防弹。而且它不会匹配Ben&;Jerry的foobar
中的foobar
改进了我的答案!是的!我为自己感到骄傲。有一个更简单的解决方案。请接受真正好的解决方案。我同意。只有一个问题,在我的脚本中不重要,但在其他人中可能重要:它将匹配&;
这样,如果字符串仅为“&;”,则使用重新测试(str)将得到true。它将被匹配但不会被捕获,因此仍然能够区分&
和非&
。
&|((?:(?!&)[\s\S])+)