2010-11-11 4 views
0

Je définis l'ensemble de regex dans le fichier XML, puis je vais les lire à partir du fichier XML pour les faire correspondre avec la chaîne. Maintenant, le problème est que si je veux les définir dans un fichier XML, alors il devrait y avoir un caractère spécial qui les distingue. Mais ce caractère ne doit pas être utilisé dans la regex comme si j'utilise $ pour distinguer un ensemble de regex alors il y aura un problème quand $ sera utilisé dans regex qui sera défini dans xml. Alors, quel est le caractère qui peut être utilisé pour distinguer les expressions régulières définies dans le fichier xml et non utilisées dans regex?Caractère qui peut être utilisé pour distinguer ensemble de regex et ce caractère ne doit pas être utilisé dans regex

Répondre

1

Je ne sais pas ce que vous entendez par un caractère spécial - mais si la question est y compris les expressions regex dans XML, vous devez utiliser la balise de section de données de caractères, <![CDATA[My unparsed data goes here.]]>:

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

Dans vos cordes regex simplement remplacer tous les espaces (' ') avec une représentation unicode équivalente ('\u0020 '), puis rejoignez-les avec un espace régulier.

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
0

Vous allez en rond en essayant de trouver un caractère. Les expressions régulières ont déjà résolu ce problème: Le premier caractère est le délimiteur, qui doit également terminer l'expression. Si ce délimiteur doit être utilisé littéralement dans l'expression, il doit être échappé.

/foo/ 
^ ^
delimiter 

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

va de même pour XML: Les <, > et & caractères ont une signification particulière, si vous voulez les utiliser dans le cadre du contenu, vous devez les échapper en utilisant &gt;, &lt; et &amp;. Alternativement, vous pouvez envelopper une section dans <![CDATA[ ]]>, mais vous ne pouvez pas utiliser la séquence ]]> à l'intérieur de ceux qui ne s'échappent pas (vous voyez, ça tourne en rond).

En tant que tel, vous aurez besoin d'échapper à l'expression delimiter et entités XML dans vos expressions:

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