使用正则表达式选择使用所需捕获组之前的最后一个模式而不是第一个模式

时间:2018-03-28 01:32:23

标签: regex

我有一个模式,我想从字符串链接捕获:

**THIS NO** **THIS NO** **THIS NO** **I SAID YES** **THIS NO**

我想要捕获文字I SAID YES。由于我必须使用的是**YES我尝试了一个正则表达式,但它从第一个**返回匹配,而不是我的模式之前的那个,请参阅Regex101下面:

https://regex101.com/r/kUBxQf/1

2 个答案:

答案 0 :(得分:0)

如下:

/[A-Z]\s*[A-Z]*(?=\sYES)/

这使用前瞻来捕获直接位于单词YES之前的两个大写单词。

每个单词用空格分隔,上面的正则表达式忽略YES之前的空格。



const string = '**THIS NO** **THIS NO** **THIS NO** **I SAID YES** **THIS NO**';
console.log(string.match(/[A-Z]\s*[A-Z]*(?=\sYES)/));




这也可以看作 here

答案 1 :(得分:0)

您使用的正则表达式\*\*(?P<Capture>.*?)YES\*\*匹配**,然后匹配任何非贪婪.*?字符,直到遇到YES为止。这将匹配:

**THIS NO** **THIS NO** **THIS NO** **I SAID YES**

您可以更新您的正则表达式以匹配**,并且在该匹配后不是* [^*]+,直到您遇到YES

\*\*(?P<Capture>[^*]+YES)\*\*

这将匹配组I SAID YES

中的Capture

<强>解释

  • \*\*匹配**
  • (?P<Capture>[^*]+YES)捕获群组并且不匹配*一次或多次
  • \*\*匹配**