0

複数のmathmlを含む大きな文字列があります。それらすべてを文字列配列で取り出したい。それらを見つけるために正規表現を使用します。しかし、正規表現に何かが欠けているため、出力がありません。

MathMlsの正規表現は何ですか?

文字列の例

« mathxmlns = \ "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» および «mathxmlns= \"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つのmathmlを取得します

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 に答える