我在xml文件中定义了一组正则表达式,然后我将从xml文件中读取它们以使它们与字符串匹配。现在的问题是,如果我想在xml文件中定义它们,那么应该有一个区分它们的特殊字符。但是这个字符一定不能在正则表达式中使用,就像我使用$来区分正则表集一样,那么当将在xml中定义的正则表达式中使用$时会出现问题。那么哪个字符可用于区分xml文件中定义的正则表达式而不用于正则表达式?
答案 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也是如此:<
,>
和&
字符具有特殊含义,如果您想将它们用作内容的一部分,则需要使用它们来转义它们>
,<
和&
。
或者,你可以在<![CDATA[ ]]>
标签中包含一个部分,但是你不能在没有转义的情况下使用序列]]>
(你知道,它会在圆圈中转移)。
因此,您需要在表达式中转义表达式分隔符和 XML实体:
<regex>/foo&\/bar>baz</</regex> (to match 'foo&/bar<baz>')
<regex><![CDATA[/foo&\/bar<baz>/]]></regex> (alternative)