正则表达式匹配2个单词,其中一个是强制性的,另一个是可选的但是在匹配位于前两个单词之后的第三个单词之后

时间:2018-04-06 12:28:09

标签: regex pcre

我陷入了以下正则表达式:

假设我有三个字:foobarwoo

如果我匹配woo,我需要找到至少与我匹配的当前foo之前最接近woo的{​​{1}}(必填项)之前的woo 。 或者,如果bar之前的woo最近,我也需要匹配。

E.g。块:

...
3218 9839201 39021 foo 389201 83902 10321
832091 83902 321890 bar 382910 9382 19832 19
woo
...

...
3218 9839201 39021 bar 389201 83902 10321
832091 83902 321890 foo 382910 9382 19832 19
woo
...

没关系,但是:

...
3218 woo 9839201 39021 bar 389201 83902 10321
832091 83902 321890 foo 382910 9382 19832 19
...

不是。

如何使用正则表达式解释这一点?

我尝试使用前瞻https://regex101.com/r/3b4dpu/3,但我不知道如何在bar之前匹配最近的woo

感谢您的关注!

编辑:我会尝试更清楚,更清楚地说明我需要做的事情:

  1. 对于多行文字或单行字符串中的任何woo,我需要匹配foo之前的最后一个woo。 如果在同一bar之前还有一个woo,可以在foo之前或之后foo我想要捕获它(它是可选的但是如果有的话,我需要它)。 对于bar,我还需要在之前匹配的bar之前的最后woo。 ;

    https://regex101.com/r/3b4dpu/5我可以通过搜索foo来有效匹配使用前瞻woo之前的foo。但我还需要在bar之前或之后匹配foowoo之前或之后barbar应该是之前woo的{​​{1}} woo。我怎么能这样做?

  2. 这将是下一步,但现在可以完成第一步...所有foo已经与相应的bar和可选{匹配} {1}}之前/之后{1}} foo之后{1}}(请注意,没有任何woo的情况也可以),我需要匹配任何内容woo可能会有foo <{1}}

  3. 之前的可选bar foo

    希望这进一步澄清我的问题,请查看regex101链接!

1 个答案:

答案 0 :(得分:0)

JavaScript与PCRE非常接近,我的正则表达式并没有使用它们之间的任何不同之处,所以我使用JavaScript是因为它允许在这里进行现场演示。

&#13;
&#13;
function check(what) {
  alert(what.innerText.match(RegExp(document.getElementById("regex").value, "m")));
}
&#13;
<body>
<p>Click on a block to run the regex against it. 
The matching text (or else "null") will appear in an alert popup.</p>

<input type="text" id="regex" style="font-family:monospace;width:90%"
  value="\bfoo\b[\s\S]*?\bwoo\b"/>

<pre onclick="check(this)">...
3218 9839201 39021 foo 389201 83902 10321
832091 83902 321890 bar 382910 9382 19832 19
woo
...</pre>

<pre onclick="check(this)">...
3218 9839201 39021 bar 389201 83902 10321
832091 83902 321890 foo 382910 9382 19832 19
woo
...</pre>

<pre onclick="check(this)">...
3218 woo 9839201 39021 bar 389201 83902 10321
832091 83902 321890 foo 382910 9382 19832 19
...</pre>
</body>
&#13;
&#13;
&#13;

这会找到&#34; foo&#34; (由\bfoo\b中的分词字符分隔),然后任意数量的字符([\s\S]都是匹配任何内容的便捷方式,而.有时会卡在是否可以匹配换行符) ,但非贪婪(*?而非*进行最短的有效匹配),然后单词&#34; woo&#34;通过\bwoo\b/m标志表示应该一次针对多行运行正则表达式。

Here it is again,在regex101上描述了正则表达式并更好地说明匹配的内容。

您还要求:

  

或者,如果bar之前的woo最近,我也需要匹配。

这对我来说没有多大意义,因为你得到任何一种方式。如果您想知道是否捕获了bar,请通过第二个正则表达式运行结果。 ...除非您说foo bar,否则您需要/\b(?:foo|bar)\b[\s\S]*?\bwoo\b/m。< / p>