我想让我的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:一个或多个字字符。