为什么正则表达式匹配此文本?

时间:2014-09-13 20:09:41

标签: regex grep

为什么是grep -noE'< math>。*< / math>'匹配

  

< math> w< / math>,来自一组< math> w< / math>   特殊二进制分数,< math> V_i,i = 1,2,\ dots,   W< /数学>叫方向号。 [[格雷码]]的位   使用< math> i< / math>,< math> G(i)< / math>,   选择方向号。获取Sobol序列值   <数学> S_I< /数学>取二进制的[[exclusive or]]   < math> i< / math>格雷码的值随着   适当的方向号码。所需的尺寸数量   影响< math> V_i< / math>的选择   37196767:其中数学> \ int_0 ^ 1 f(u)\,du \ approx   \ frac {1} {N} \,\ sum_ {i = 1} ^ N f(x_i)。 < /数学>

我只想让每个元素独立,而不是贪婪。

3 个答案:

答案 0 :(得分:3)

您需要指定非贪婪版本:.*?,但grep正则表达式不支持它。

如果您使用GNU grep,则可以使用-P选项(或--perl-regexp):

grep -noP '<math>.*?</math>'

答案 1 :(得分:2)

使用:

grep -noE '<math>[^<]*</math>'

不是在<math></math>之间匹配任何序列,而是在序列中不允许<,因此它不允许</math>在内部。{ / p>

它也不会允许任何其他标签,但看起来这对您的文字来说不是问题。

如果您使用的是支持PCRE的工具,则可以使用非贪婪的正则表达式:

<math>.*?</math>

标准版grep不使用PCRE,但如果您使用GNU grep,则可以使用-P选项。

答案 2 :(得分:1)

由于.*是贪婪的,因此它会从首次找到的<math>到最后找到的</math>匹配