2011-07-09 77 views
1

我使用CodeMirror并尝试创建我自己的mode-changing demo版本。我有一个<textarea>,我在其上侦听更改,当发生更改时,我想查看<textarea>中的值并确定它是否为MathML的形式。正则表达式在JavaScript中检测textarea中的MathML

所以我只需要一个非常粗略的/黑客的方式来检测<textarea>中的值是否为MathML;它不一定是完美的。我想,我可以运行一个正则表达式的<textarea>变化时,寻找以下任何标记:

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

我需要从<textarea>拿绳子,看,如果这些标签是一个字符串。我将如何编写这个正则表达式?

回答

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解释如何讲述了一个正则表达式从字符串或数字或任何其他类型的令牌文字。

<m匹配任何mathml标签的前两个字符。 (?:)组成一个非捕获组。它与算术表达式中的括号相同。以相同的方式,您必须在(a + b) * (c + d)中使用括号,我使用上述括号来区分<m(?:frac|sup)<mfrac|sup。后者在它之前将匹配"<mfrac""sup"而不带<m

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

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

+0

我明白中间是匹配任何以字母'm'开头的标签,但是你能解释那个正则表达式的开始和结束吗?所以,'/ ] *> /'? – Hristo

+0

@Hristo,编辑该帖子并附上说明。 –

+0

@Mike ...谢谢! – Hristo