问题描述
|
我有一个包含多个mathml的大字符串。想要将所有字符串都取出来。使用正则表达式查找它们。但是正则表达式中缺少某些内容,因此它不提供任何输出。
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个数学
解决方法
您不能使用Java的regex引擎执行此操作,因为这是有效的输入:
<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>`