所以我知道
[^A-Za-z]
将匹配任何非字母的字符。
有什么办法可以在团体中做到这一点吗?例如:
(?^:&)
- 将匹配不是序列 &
的任何字符序列
注意:正如Mark Reed指出的那样,匹配空字符串是没有意义的,因为空字符串是不是序列的字符序列,所以我希望正则表达式匹配尽可能多的字符尽可能
例如:
在Ben & Jerry's
中,匹配项将是
Ben
和
Jerry's
(请注意,
Ben
之后和
Jerry's
之前的空格也会被捕获。
注意:如果可能,请不要使用look Behinds,因为我将在JS脚本中使用正则表达式,而Javascript不支持look Behinds。
捕获到第1组中,最后一个替代项将呈现一个调和的贪婪标记(或展开版本以获得更好的性能 - 如果您只有2个或3):
&|((?:(?!&)[\s\S])+)
查看
正则表达式演示(展开版本 - &|([^&]*(?:&(?!amp;)[^&]*)*)
&
- 匹配
&
实体
|
- 或
((?:(?!&)[\s\S])+)
- 将不是
&
序列起点的任何文本块(1 个以上字符)匹配并捕获到组 1 中。由于它是针对 JS 的,因此您需要一个
[\s\S]
(或
[^]
)来匹配任何字符包括 换行符。否则,请使用
.
(如果您只想匹配lines)。
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>";
兰德尔规则。
兰德尔法则Randal Schwartz(
学习 Perl 的作者)说:
当您知道要保留什么时,请使用捕获。当您知道要扔掉什么时,请使用
split
。
var s = "Ben & Jerry's";
var a = s.split(/&/);
document.body.innerHTML = "<pre>[" + a.join("][") + "]</pre>";