匹配模式前面没有字符



我想让我的regex匹配一个模式,只有当它之前没有字符,^(在我的情况下)

我的正则表达式:/[^^]w+/g

测试文本:Test: ^Anotherword

匹配:"Test"one_answers" Anotherword",尽管后者前面有一个绕行符。我试图通过在开始时插入[^^]来防止。所以我不仅要试着不匹配这个单词,还要匹配它后面的单词。"另一个词"不应该匹配。

[^^] -这是应该阻止匹配的regex,如果一个重音圆圈在它的前面。

w+ -匹配前面没有绕行符的任何单词。

由于JavaScript的限制,我不能使用lookbehind

使用([^^w]|^)w+
(见http://regexr.com/3e85b)

它基本上注入了一个词边界,同时也排除了^。
[^w] = Wbw

否则[^^]将匹配'^ T '
w+将匹配est

你可以看到,如果你在它周围添加捕捉组

如果不严格禁止匹配。

(?:^w+)|(w+):匹配两个表达式,但不为^Anotherworld生成组。

  • (?:^w+):匹配^Kawabanga,但不生成组
  • (w+):所有其他的分组。

如果你想要^Anotherworld有一个组,只需删除?:

随着ECMAScript 2018标准被越来越多地采用,考虑向后看的方法也是有意义的:

const text = "One Test: ^Anotherword";
// Extracing words not preceded with ^:
console.log(text.match(/b(?<!^)w+/g)); // => [ "One", "Test" ]
// Replacing words not preceded with ^ with some other text:
console.log(text.replace(/b(?<!^)w+/g, '<SPAN>$&</SPAN>'));
// => <SPAN>One</SPAN> <SPAN>Test</SPAN>: ^Anotherword

b(?<!^)w+正则表达式匹配一个或多个在左侧没有字字符(字母,数字或_)的字字符(w+)(通过字边界b实现),在左侧没有字字符(^)(通过在(?<!^)后面的反向查找实现)。请注意,^是一个特殊的regex元字符,如果想将其作为插入字符匹配,则需要对其进行转义。

对于较旧的JavaScript环境,仍然需要使用变通方法:

var text = "One Test: ^Anotherword";
// Extracing words not preceded with ^:
var regex = /(?:[^w^]|^)(w+)/g, result = [],  m;
while (m = regex.exec(text)) {
    result.push(m[1]);
}
console.log(result); // => [ "One", "Test" ]
// Replacing words not preceded with ^ with some other text:
var regex = /([^w^]|^)(w+)/g;
console.log(text.replace(regex, '$1<SPAN>$2</SPAN>'));
// => <SPAN>One</SPAN> <SPAN>Test</SPAN>: ^Anotherword

提取和替换regexp在捕获组的数量上有所不同,因为在提取时,我们只需要一个组,而在替换时,我们需要两个组。如果您决定使用带有两个捕获组的正则表达式进行提取,则需要收集m[2]值。

提取模式意味着

  • (?:[^w^]|^)—非捕获组匹配
    • [^w^] -任何字符除了一个字和^字符
    • | -或
    • ^ -字符串
    • 起始
  • (w+) -组1:一个或多个字字符。

最新更新