Найти mathmls из строки, используя Java - PullRequest
0 голосов
/ 26 мая 2011

У меня есть Большая строка, в которой есть несколько математиков.Хотите вынести их все в массив строк.Используя регулярные выражения, чтобы найти их.Но чего-то не хватает в регулярном выражении, поэтому оно не дает никакого вывода.

Что такое регулярное выражение для 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

1 Ответ

1 голос
/ 26 мая 2011

Вы не можете сделать это с помощью механизма регулярных выражений 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.

EDIT

Могу ли я считать все это строкой и найти шаблон, который соответствует? Это то, что я пытаюсь. И не будет никаких рекурсивных тегов внутри другого тега. они будут на одном уровне.

В этом случае попробуйте этот шаблон:

<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>`
...