javascript - 正则表达式中的非分组

标签 javascript regex

所以我明白 [^A-Za-z]将匹配任何不是字母的字符。

有没有办法和一个小组一起做这件事?例如:(?^:&) - 将匹配任何不是序列 & 的字符序列

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

例如:

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

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

最佳答案

您需要的是一个匹配备选方案的正则表达式,并且只会将显示 tempered greedy token 的最后一个备选方案捕获到第 1 组中。 (或展开版本以获得更好的性能 - 如果您只有 2 个或 3 个):

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

regex demo (一个 unrolled version - &|([^&]*(?:&(?!amp;)[^&]*)*)

图案:
  • & - 匹配 &实体
  • | - 或
  • ((?:(?!&)[\s\S])+) - 将不是 & 起点的任何文本 block (1+ 个字符)匹配并捕获到组 1 中序列。既然是JS用的,就需要[\s\S] (或 [^] )匹配任何字符,包括换行符。否则,请使用 .而是(如果您只打算匹配行)。


  • var re = /&|((?:(?!&)[\s\S])+)/g; 
    var str = 'abc Ben & Jerry\'s    foobar ssss  sss  sss &\n\n\nsssss&sssss     &\n\nsssss&sssss     &sssss\n&sssss&\n&&';
    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>";

    关于javascript - 正则表达式中的非分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36754105/

    相关文章:

    javascript - 在这种情况下,无需使用 javascript 对象即可解决问题

    java - 正则表达式替换 &,但仅限于链接内部

    正则表达式 - 比较两个捕获组

    c# - 正则表达式情况...多个具有可变空间的组

    java - 正则表达式 - 查找文件中的所有字符串函数参数

    php - 将 JavaScript 变量发送到 PHP 变量的安全性

    javascript - 单击“浏览”按钮更改默认窗口位置

    javascript - IE10 在更改样式时只给我一个 'Unable to evaluate expression' 错误

    python - 如何从python中的字符串中提取数字

    java - 如何将数组从java传递到javascript