所以我明白 [^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, '&') + "</pre>";
document.body.innerHTML += "<pre>AFTER:<br/>" + res.join("") + "</pre>";
关于javascript - 正则表达式中的非分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36754105/