此正则表达式在以逗号和空格开头时匹配“ so”:
(,\s)(so)
我现在想相反。我想告诉正则表达式:如果前面带有逗号和空格,则不匹配“ so”。我尝试了此操作(在看到this这样的问题之后):
^(,\s)(so)
但是现在正则表达式不匹配任何内容:https://regexr.com/4kgq8。
注意:我不是要匹配行首。
答案 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
之前出现逗号和空格,则匹配失败。
注意事项是Java lookbehind
支持仅在现代浏览器中可用。
如果您还想支持旧版或旧版浏览器,那么方法是使用捕获的组并交替丢弃不需要的匹配项:
/(?:, so|(\bso))\b/g
在此,通过每个匹配项中捕获组#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])
});