正则表达式中的非分组

问题描述 投票:0回答:3

所以我知道

[^A-Za-z]
将匹配任何非字母的字符。

有什么办法可以在团体中做到这一点吗?例如:

(?^:&)
- 将匹配不是序列
&

的任何字符序列

注意:正如Mark Reed指出的那样,匹配空字符串是没有意义的,因为空字符串是不是序列的字符序列,所以我希望正则表达式匹配尽可能多的字符尽可能

例如:

Ben & Jerry's

 中,匹配项将是 
Ben
Jerry's
(请注意,
Ben
 之后和 
Jerry's
 之前的空格也会被捕获。

注意:如果可能,请不要使用look Behinds,因为我将在JS脚本中使用正则表达式,而Javascript不支持look Behinds。

javascript regex
3个回答
4
投票
您需要的是一个匹配替代项的正则表达式,并且只会将

捕获到第1组中,最后一个替代项将呈现一个调和的贪婪标记(或展开版本以获得更好的性能 - 如果您只有2个或3):

&|((?:(?!&)[\s\S])+)

查看

正则表达式演示展开版本 - &|([^&]*(?:&(?!amp;)[^&]*)*)



图案:

  • &
     - 匹配 
    &
     实体
  • |
     - 或
  • ((?:(?!&)[\s\S])+)
     - 将不是 
    &
     序列起点的任何文本块(1 个以上字符)匹配并捕获到组 1 中。由于它是针对 JS 的,因此您需要一个 
    [\s\S]
     (或 
    [^]
    )来匹配任何字符 
    包括 换行符。否则,请使用 .
     (如果您只想匹配 
    lines)。

var re = /&amp;|((?:(?!&amp;)[\s\S])+)/g; var str = 'abc Ben &amp; Jerry\'s foobar ssss sss sss &amp;\n\n\nsssss&amp;sssss &amp;\n\nsssss&amp;sssss &amp;sssss\n&amp;sssss&amp;\n&amp;&amp;'; var res = []; while ((m = re.exec(str)) !== null) { if (m.index === re.lastIndex) {// A part of code only necessary for the re.lastIndex++; // unrolled pattern (as it can match empty string) } res.push(m[1]); // Only collect the captured texts } document.body.innerHTML = "<pre>BEFORE:<br/>" + str.replace(/&/g, '&amp;') + "</pre>"; document.body.innerHTML += "<pre>AFTER:<br/>" + res.join("") + "</pre>";


3
投票
简单:

(.*?)(?:&amp;)|((?!&amp;).*)$

演示

说明:

  1. (.*?)
    :什么都拿,但不贪心。
  2. (?:&amp;)
    ?:
    是非捕获组。一个你不想得到价值的群体。
  3. ((?!&amp;).*)$
    :获取字符串中不属于 
    &amp;
     的其余部分
    

0
投票
参见

兰德尔规则

兰德尔法则

Randal Schwartz(

学习 Perl 的作者)说:

当您知道要保留什么时,请使用捕获。

当您知道要扔掉什么时,请使用

split

var s = "Ben &amp; Jerry's"; var a = s.split(/&amp;/); document.body.innerHTML = "<pre>[" + a.join("][") + "]</pre>";
    
© www.soinside.com 2019 - 2024. All rights reserved.