使用g修饰符进行正则表达式捕获仅捕获第一次出现

时间:2018-06-15 08:54:53

标签: regex ecmascript-6

使用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'。

对某些示例的任何指示都将不胜感激 - 我找不到任何。

1 个答案:

答案 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);




请参阅this regex demo

<强>详情

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