使用java从String中查找mathmls

时间:2011-05-26 10:58:59

标签: java regex mathml

我有一个Big字符串,里面有多个数学运算符。想要在字符串数组中取出所有这些。使用正则表达式找到它们。但正则表达式中缺少一些东西,所以它不会给出任何输出。

MathMls的正则表达式是什么?

示例字符串

  

查找总和«math xmlns = \“http://www.w3.org/1998/Math/MathML \”»«mroot»«mrow»«mi»#«/ mi »«MI»一个«/ MI»«/ MROW»«MN»3«/ MN»«/ mroot»«莫»=«/月»«mroot»«MROW»«MI»#«/ MI»«MI» b«/ mi»«/ mrow»«mn»3«/ mn»«/ mroot»«/ math»«math xmlns = \“http://www.w3.org/1998 /数学/ MATHML \“»«MO»=«/月»«MSUP»«mfenced»«MROW»«MI»#«/ MI»«MI信息»b«/ MI»«/ MROW»«/ mfenced»«mfrac »«MN»1«/ MN»«MN»3«/ MN»«/ mfrac»«/ MSUP»«/数学»

从这个得到2个数学

1 个答案:

答案 0 :(得分: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>`