在正则表达式中不能使用可用于区分正则表达式和该字符集的字符

时间:2010-11-11 06:38:27

标签: xml regex

我在xml文件中定义了一组正则表达式,然后我将从xml文件中读取它们以使它们与字符串匹配。现在的问题是,如果我想在xml文件中定义它们,那么应该有一个区分它们的特殊字符。但是这个字符一定不能在正则表达式中使用,就像我使用$来区分正则表集一样,那么当将在xml中定义的正则表达式中使用$时会出现问题。那么哪个字符可用于区分xml文件中定义的正则表达式而不用于正则表达式?

3 个答案:

答案 0 :(得分:1)

不确定特殊字符的含义 - 但如果问题是在XML中包含正则表达式,则应使用字符数据部分标记<![CDATA[My unparsed data goes here.]]>

<regexes>
  <regex><![CDATA[/^\w+$/]]></regex>
  <regex><![CDATA[/^\d+/]]></regex>
  <regex><![CDATA[/^\[a-zA-Z]\@example\.com$/]]></regex>
</regexes>

答案 1 :(得分:0)

在你的正则表达式字符串中,只需用等效的unicode表示(' '')替换所有空格('\u0020),然后用常规空格将它们连接起来。

irb(main):001:0> regexps = [/^a b/, /end$/, /[ ]+/]
=> [/^a b/, /end$/, /[ ]+/]
irb(main):002:0> attr = regexps.map{|r| r.source.gsub(' ', '\u0020')}.join(' ')
=> "^a\\u0020b end$ [\\u0020]+"

irb(main):006:0> regexps = attr.split(' ').map{|s| Regexp.new(s)}
=> [/^a\u0020b/, /end$/, /[\u0020]+/]
irb(main):008:0> regexps[0] =~ 'a bdbbb'
=> 0

答案 2 :(得分:0)

你会绕圈试图找到一个角色。正则表达式已经解决了这个问题:第一个字符是分隔符,它也必须结束表达式。如果要在表达式中使用此分隔符,则需要对其进行转义。

/foo/
^   ^
delimiter

/foo\/bar/
     ^
escaped literal '/' character

对于XML也是如此:<>&字符具有特殊含义,如果您想将它们用作内容的一部分,则需要使用它们来转义它们&gt;&lt;&amp;

或者,你可以在<![CDATA[ ]]>标签中包含一个部分,但是你不能在没有转义的情况下使用序列]]>(你知道,它会在圆圈中转移)。

因此,您需要在表达式中转义表达式分隔符 XML实体:

<regex>/foo&amp;\/bar&gt;baz&lt;/</regex>   (to match 'foo&/bar<baz>')
<regex><![CDATA[/foo&\/bar<baz>/]]></regex>  (alternative)