1

我正在使用CodeMirror并尝试创建我自己的模式更改演示版本。我有一个<textarea>监听变化,当有变化时,我想查看其中的值<textarea>并确定它是否采用 MathML 的形式。

所以我只需要一种非常粗略/骇人听闻的方法来检测中的值是否<textarea>是 MathML;它不一定是完美的。我认为我可以在<textarea>更改时运行正则表达式并查找以下任何标签:

<mfrac>
<msup>
<msub>
<msqrt>
<mroot>
<mfenced>
<msubsup>
<munderover>
<munder>
<mtable>
<mtr>
<mtd>
<mrow>
<mi>
<mo>

我需要从中获取字符串<textarea>并查看这些标签中是否有任何一个子字符串。我将如何编写这个正则表达式?

4

1 回答 1

3
/<m(?:frac|sup|sub|sqrt|root|fenced|subsup|underover|under|table|tr|td|row|i|o)\b/

将识别任何此类标签的开始。

要找到一个完整的格式良好的标签,您需要在关闭之前查找属性,>这更难。就像是

/<m(?:frac|sup|sub|sqrt|root|fenced|subsup|underover|under|table|tr|td|row|i|o)\b[^>]*>/

不保证匹配整个标签,但会确保>标签开始后有一个。

编辑:

... 什么是 /]*>/?

正则表达式必须在引号内/.../,就像字符串必须在引号内一样,因为这是 JavaScript 解释器从字符串、数字或任何其他类型的标记中告诉正则表达式文字的方式。

匹配任何 mathml 标记的<m前两个字符。和(?:形成)一个非捕获组。它与算术表达式中的括号相同。以同样的方式,您必须在上面使用括号来(a + b) * (c + d)区分<m(?:frac|sup). <mfrac|sup后者既可以匹配也可以"<mfrac""sup"匹配<m

最后\b是一个单词中断。它说名字后面不应该有另一个单词字符。所以<msub\b匹配"<msub"但不匹配"<msubmarine"

[^>]*位匹配除 之外的任意数量的字符'>'。这[...]是一个字符集,因此[a-z]匹配任何小写罗马字母。^否定它,因此匹配[^a-z]任何不是小写罗马字母的字符。

于 2011-07-09T23:53:09.710 回答