代码之家  ›  专栏  ›  技术社区  ›  Dervin Thunk

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

  •  0
  • Dervin Thunk  · 技术社区  · 10 年前

    为什么grep-noE'<数学>*</数学>'匹配

    <数学>w</数学>,从一组<数学>w</数学> 特殊二进制分数<数学>V_i,i=1,2,\dots, w</数学>称为方向号。[[格雷码]]的位 的<数学>i</数学>&书信电报;数学>G(i)</数学>,已使用 选择方向编号。获取Sobol序列值 <数学>s_ i</数学>取二进制的[[exclusive或]] <数学>i</数学>使用 适当的方向编号。所需尺寸的数量 影响<数学>V_i</数学> 37196767:<数学>\int_0^1 f(u)\,du\近似值 \分数{1}{N}\,总和{i=1}^N f(x_i)</数学>

    我只希望每个元素都有自己的元素,而不是贪婪。

    3 回复  |  直到 10 年前
        1
  •  3
  •   falsetru    10 年前

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

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

    grep -noP '<math>.*?</math>'
    
        2
  •  2
  •   Barmar    10 年前

    使用:

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

    而不是匹配 <math> </math> ,这将不允许 < 在序列中,所以它不允许 </数学> 在…内

    它也不允许任何其他标记,但看起来这对您的文本没有问题。

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

    <math>.*?</math>
    

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

        3
  •  1
  •   Jotne    10 年前

    自从 .* 是贪婪的,它将匹配从第一次发现 <math> 到最后找到 </math>