如果在特定单词之前存在字符加空格,则不匹配

时间:2019-09-06 05:24:44

标签: javascript regex

此正则表达式在以逗号和空格开头时匹配“ so”:

(,\s)(so)

我现在想相反。我想告诉正则表达式:如果前面带有逗号和空格,则不匹配“ so”。我尝试了此操作(在看到this这样的问题之后):

^(,\s)(so)

但是现在正则表达式不匹配任何内容:https://regexr.com/4kgq8

注意:我不是要匹配行首。

3 个答案:

答案 0 :(得分:2)

或者,如果可以的话,您也可以简单地使用替换,并使用不带环顾四周的表达式,例如:

, so|(\bso\b)

const regex = /, so|(\bso\b)/gmi;
const str = `So that 
so big that 
, so
and not , so
, so so`;
let m;

while ((m = regex.exec(str)) !== null) {
    // This is necessary to avoid infinite loops with zero-width matches
    if (m.index === regex.lastIndex) {
        regex.lastIndex++;
    }
    
    // The result can be accessed through the `m`-variable.
    m.forEach((match, groupIndex) => {
        console.log(`Found match, group ${groupIndex}: ${match}`);
    });
}


  

如果您想探索/简化/修改表达式,可以   在右上角的面板上进行了说明   regex101.com。如果您愿意,   也可以在this link中观看它的匹配方式   针对一些样本输入。


答案 1 :(得分:2)

就像anubhava在评论中提到的那样,如果 lookbehind 为负,您可以执行/(?<!,\s)(so)/,它将与{em> not 前面的so相匹配逗号和一个空格(并捕获so)。这与/(?<=,\s)(so)/的相反,后者与<{>> 前面带有逗号和空格的so相匹配。

您的正则表达式/(,\s)(so)/与逗号,空格和so匹配(并在一组中捕获逗号和空格,在另一组中捕获so)。可以使用所有浏览器都支持的负数 lookahead 来构造该字符的取反,例如:/((?!,\s)..|^.?)(so)/-它将匹配两个字符(如果在字符串开头,则更少)而不是逗号和空格,然后是so(并同时捕获非逗号空格的前字符和so)。

通常,第二种方法有一个缺点:当您匹配的数量超过您想要的数量时,对重叠匹配的限制可能会使您到处丢失匹配。但是,在这种特殊情况下,这不是问题,因为任何重叠的字符都是so,而不是逗号和空格。

(编辑:我在这里写了“空格”,但是所有表达式都是在OP使用\s之后编写的,实际上是用于空白,其中不仅包含空格。)< / p>

答案 2 :(得分:2)

  

我想告诉正则表达式:如果前面加逗号和空格,则不匹配“ so”。

最好的解决方案是在我在以下问题的评论中提到的否定性回溯:

/(?<!, )so/g

在这里,(?<!, )是一个负向后看表达式,如果在so之前出现逗号和空格,则匹配失败。

RegEx Demo 1

注意事项是Java lookbehind支持仅在现代浏览器中可用。


如果您还想支持旧版或旧版浏览器,那么方法是使用捕获的组并交替丢弃不需要的匹配项:

/(?:, so|(\bso))\b/g

RegEx Demo 2

在此,通过每个匹配项中捕获组#1的存在来定义一个匹配项。我们正在交替的左侧匹配并丢弃", so的不需要的匹配。我们所需的匹配字符串位于交替的右侧,该字符串在组#1中捕获。

代码:

var arr = ['So that', 
'so big that', 
', so so'];

const regex = /(?:, so|(\bso))\b/g;

arr.forEach((el) => {
  m = regex.exec(el);
  if (m && m.length > 1)
    console.log('Line; [', el, ' ] Start:', regex.lastIndex, m[1])
});