【问题标题】:Find mathmls from a String using java使用java从字符串中查找mathmls
【发布时间】:2011-09-02 12:09:02
【问题描述】:

我有一个大字符串,其中包含多个数学。想把它们全部取出一个字符串数组。使用正则表达式找到它们。但是正则表达式中缺少一些东西,所以它没有给出任何输出。

MathMls 的正则表达式是什么?

示例字符串

求和 «math xmlns=\"http://www.w3.org/1998/Math/MathML\"»«mroot»«mrow»«mi»#«/mi »«mi»a«/mi»«/mrow»«mn»3«/mn»«/mroot»«mo»=«/mo»«mroot»«mrow»«mi»#«/mi»«mi» b«/mi»«/mrow»«mn»3«/mn»«/mroot»«/math» «math xmlns=\"http://www.w3.org/1998 /Math/MathML\"»«mo»=«/mo»«msup»«mfenced»«mrow»«mi»#«/mi»«mi»b«/mi»«/mrow»«/mfenced»«mfrac »«mn»1«/mn»«mn»3«/mn»«/mfrac»«/msup»«/math»

从这里得到 2 个 mathmls

【问题讨论】:

    标签: java regex mathml


    【解决方案1】:

    Java 的正则表达式引擎无法做到这一点,因为这是有效的输入:

    <math>
      <apply>
        <plus/>
        <apply>
          <times/>
          <ci>a</ci>
          <apply>
            <power/>
            <ci>x</ci>
            <cn>2</cn>
          </apply>
        </apply>
        <apply>
          <times/>
          <ci>b</ci>
          <ci>x</ci>
        </apply>
        <ci>c</ci>
      </apply>
    </math>
    

    即:可以有任意嵌套标签,Java 的正则表达式引擎无法匹配递归模式。您将不得不求助于some parser 来处理 MathML 输入。

    编辑

    我可以将整个事物视为一个字符串并找到匹配的模式吗?这就是我正在尝试的。并且在另一个标签内不会有任何递归标签。他们将处于同一水平。

    在这种情况下,试试这个模式:

    <math[>\s](?s).*?</math>
    

    或作为字符串文字:

    "<math[>\\s](?s).*?</math>"
    

    意思是:

    <math[>\s]   # match `<math` followed by a space or `>`
    (?s).*?      # reluctantly match zero or more chars (`(?s)` causes `\r` 
                 # and `\n` also to be matched)
    </math>      # match `</math>`
    

    【讨论】:

    • 我可以将整个事物视为一个字符串并找到与 匹配的模式吗?这就是我正在尝试的。并且在另一个 标记内不会有任何递归 标记。他们将处于同一级别。
    • Super.. "\\s](?s).*?" 做到了。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-04
    • 2016-07-25
    • 2023-03-12
    • 2017-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多