使用EcmaScript 6 RegExp 由此:“ - = A部分= - 文本A - = B部分= - 文本b” 我想得到这个:['A部分','文字A','B部分','文字B']
除了分隔符之外,其他一切都是可变的。 (最终' - = someString = - '将是''但是现在我不想让事情变得混乱或者用需要转义的字符创建错误。)
我不是一名正则表达式专家,但我整天都在寻找一个例子或指导来使这项工作取得成功。
例如使用此代码:
let templateString = "-=Section A=- text A -=Section B=- text b";
let regex = RegExp('-=(.*?)=-(.*?)','g');
我只能得到这个:[“ - = A部分= - ”,“A部分”,“”]
我不确定如何使第二个捕获捕获'文本A'。另外我不明白为什么g修饰符在第一场比赛后没有继续,继续找到'B部分'和'文字B'。
对某些示例的任何指示都将不胜感激 - 我找不到任何。
答案 0 :(得分:1)
请注意,模式末尾的(.*?)
将始终匹配空字符串,因为它是惰性的,并且不会在第一个位置执行。 text A
cannot be matched因为匹配以=-
结尾,因为.*?
不必匹配。
您可以使用
let templateString = "-=Section A=- text A -=Section B=- text b";
let regex = /\s*-=(.*?)=-\s*/;
console.log(templateString.split(regex).filter(Boolean));

\s*-=(.*?)=-\s*
模式找到
\s*
- 0+ whitespaces -=
- -=
子字符串(.*?)
- 第1组:任何0+字符,尽可能少到第一次出现的后续子图案=-
- =-
子字符串\s*
- 0+空格。 String#split
方法将结果数组添加到捕获到组1中的所有子字符串。
如果要使用匹配方法,则需要匹配任何不会启动前导char序列的char,0或更多次出现,在您的场景中似乎为-=
:
let templateString = "-=Section A=- text A -=Section B=- text b";
let regex = /-=(.*?)=-\s*([^-]*(?:-(?!=)[^-]*)*)/g;
let m, res=[];
while (m=regex.exec(templateString)) {
res.push([m[1], m[2].trim()]);
}
console.log(res);

<强>详情
-=(.*?)=-\s*
- 与第一个正则表达式相同(请参阅上面的拆分正则表达式)([^-]*(?:-(?!=)[^-]*)*)
- 匹配并捕获的第2组:
[^-]*
- 除-
(?:
- 开始匹配的非捕获组
-(?!=)
- 没有紧跟=
[^-]*
- 除-
)*
- ...零次或多次