2010-01-11 4 views
3

Je cherche à construire un motif composé de parties fixes et d'une variable (en réalité le nom de la Business Unit). En fait, il y a de fortes chances que la variable contienne des caractères regex spécifiques qui peuvent être reconnus comme ceux du contrôle regex (ie + ou *).Echappement d'un motif regex partiel

Existe-t-il une balise regex qui remarque qu'une sous-partie de modèle doit être considérée uniquement comme du texte et ignore la signification char spécifique?

une sorte de:

regex_fixed_part [escape]business + unit[/espace] regex_fixed_part 

ici, affaires + unité sera remplacé dans l'analyseur par entreprise \ + unité

De toute évidence, je ne pouvais échapper à la main tous regex char, mais Je recherche une méthode plus propre.

Merci

+2

Quelle langue utilisez-vous? –

+0

Je préfère plutôt être indépendant de la langue. Je suis en C# et pour ce faire, je pourrais utiliser la méthode Regex.Escape. mais je voulais avoir cette capacité directement dans le modèle regex – camous

Répondre

4

De nombreuses versions d'expressions régulières ont une méthode d'utilitaire qui échappe automatiquement les caractères méta. Java le fait en utilisant Pattern.quote(String) et PHP a une fonction similaire: preg_quote(string). De nombreuses implémentations PCRE prennent également en charge les séquences d'échappement \Q et \E. \Q laissera le moteur d'expression régulière interpréter tous les caractères après lui comme des littéraux pleins jusqu'au prochain \E.

Exemple:

a\Q+*\Eb+ 

correspondra à la chaîne a+*bbb.

+0

c'était exactement ce que je cherchais (dommage que je ne l'ai pas trouvé par moi-même), malheureusement, ne semble pas être reconnu en C# | ArgumentException: séquence d'échappement non reconnue \ Q. – camous

+1

Alors vous n'avez pas de chance. Selon http://www.regular-expressions.info/characters.html, seul le moteur JGsoft, Perl, PHP et Java supporte '\ Q .. \ E'. On dirait que vous aurez besoin de Regex.Escape (comme vous l'avez déjà mentionné). –

+0

@camous - ceci n'est pas supporté par .net selon http://www.regular-expressions.info/refflavors.html. Vraisemblablement, vous devrez construire la chaîne de toute façon, donc 'Regex.Escape' ne le complique pas trop. – Kobi

0

Quelle langue?

En python:

import re 
regex_fixed = re.escape("business + unit") 

en php, utilisez preg_quote()

+2

en PHP, preg_quote() devrait être utilisé – duckyflip

+0

Non, en PHP, vous devez utiliser 'preg_quote'. 'addslashes' est utilisé pour les chaînes d'échappement utilisées dans SQL. –

+0

Merci, corrigé – Kimvais

0

En Java, utilisez Pattern.quote() ou "\\Qprotected part\\E" si vous voulez le faire manuellement.

0

Remplacez [[\]\^\-\\\/?*+$().|] par \$& (barre oblique inverse suivie de $&, la chaîne correspondante) avec le drapeau global activé.

Questions connexes