我陷入了以下正则表达式:
假设我有三个字:foo
,bar
和woo
。
如果我匹配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
。
感谢您的关注!
编辑:我会尝试更清楚,更清楚地说明我需要做的事情:
对于多行文字或单行字符串中的任何woo
,我需要匹配foo
之前的最后一个woo
。
如果在同一bar
之前还有一个woo
,可以在foo
之前或之后foo
我想要捕获它(它是可选的但是如果有的话,我需要它)。
对于bar
,我还需要在之前匹配的bar
之前的最后woo
。 ;
https://regex101.com/r/3b4dpu/5我可以通过搜索foo
来有效匹配使用前瞻woo
之前的foo
。但我还需要在bar
之前或之后匹配foo
,woo
之前或之后bar
,bar
应该是之前woo
的{{1}} woo
。我怎么能这样做?
这将是下一步,但现在可以完成第一步...所有foo
已经与相应的bar
和可选{匹配} {1}}之前/之后{1}} foo
之后{1}}(请注意,没有任何woo
的情况也可以),我需要匹配任何内容woo
可能会有foo
<{1}}
bar
foo
醇>
希望这进一步澄清我的问题,请查看regex101链接!
答案 0 :(得分:0)
JavaScript与PCRE非常接近,我的正则表达式并没有使用它们之间的任何不同之处,所以我使用JavaScript是因为它允许在这里进行现场演示。
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;
这会找到&#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>