0

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

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

4

1 回答 1

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 的正则表达式引擎无法匹配递归模式。您将不得不求助于一些解析器来处理 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>`
于 2011-05-26T11:05:11.737 回答