Java a-t-il un moyen intégré pour échapper au texte arbitraire afin qu'il puisse être inclus dans une expression régulière? Par exemple, si mes utilisateurs entrent "5 $", je voudrais faire correspondre exactement cela plutôt qu'un "5" après la fin de la saisie.
320
\Q
et\E
. Cela peut conduire à des résultats inattendus, par exemplePattern.quote("*.wav").replaceAll("*",".*")
entraînera\Q.*.wav\E
et non.*\.wav
, comme vous pouvez vous y attendre."mouse".toUpperCase().replaceAll("OUS","ic")
il reviendraMicE
. Vous attendez would't pour revenirMICE
parce que vous n'avez pas appliquétoUpperCase()
suric
. Dans mon exemple, ilquote()
est également appliqué sur l'.*
insertreplaceAll()
. Vous devez faire autre chose, peut.replaceAll("*","\\E.*\\Q")
- être que cela fonctionnerait, mais c'est contre-intuitif.*.wav
en motif regex\*\.wav
et le replaceAll le transformerait\.*\.wav
, ce qui signifie qu'il le ferait correspond à des fichiers dont le nom consiste en un nombre arbitraire de périodes suivies de.wav
. Vous en auriez probablement eu besoinreplaceAll("\\*", ".*")
s'ils étaient partis avec l'implémentation la plus fragile qui repose sur la reconnaissance de tous les characheurs de regex actifs possibles et leur échappance individuelle ... serait-ce tellement plus facile?La différence entre
Pattern.quote
etMatcher.quoteReplacement
n'était pas claire pour moi avant de voir l'exemple suivantla source
Pattern.quote
remplace les caractères spéciaux dans les chaînes de recherche d'expression régulière, comme. | + () Etc., etMatcher.quoteReplacement
remplace les caractères spéciaux dans les chaînes de remplacement, comme \ 1 pour les références arrières.quoteReplacement
ne se soucie que des deux symboles$
et\
qui peuvent par exemple être utilisés dans des chaînes de remplacement comme références arrières$1
ou\1
. Il ne doit donc pas être utilisé pour échapper / citer une expression régulière.$Group$
avecT$UYO$HI
. Le$
symbole est spécial à la fois dans le motif et dans le remplacement:"$Group$ Members".replaceFirst(Pattern.quote("$Group$"), Matcher.quoteReplacement("T$UYO$HI"))
Il peut être trop tard pour répondre, mais vous pouvez également utiliser
Pattern.LITERAL
, qui ignorerait tous les caractères spéciaux lors du formatage:la source
Pattern.CASE_INSENSITIVE
Je pense que c'est ce que vous recherchez
\Q$5\E
. Voir égalementPattern.quote(s)
introduit dans Java5.Voir Pattern javadoc pour plus de détails.
la source
Tout d'abord, si
il ne mettra pas un 1 à la fin. Il examinera l'expression rationnelle de recherche pour le premier groupe et le sous-groupe correspondants. C'est ce que signifie $ 1, $ 2 ou $ 3 dans le texte de remplacement: les groupes correspondants du modèle de recherche.
Je branche fréquemment de longues chaînes de texte dans des fichiers .properties, puis je génère des sujets et des corps d'e-mails à partir de ceux-ci. En effet, cela semble être la façon par défaut de faire i18n dans Spring Framework. J'ai mis des balises XML, en tant qu'espaces réservés, dans les chaînes et j'utilise replaceAll () pour remplacer les balises XML par les valeurs au moment de l'exécution.
J'ai rencontré un problème où un utilisateur saisissait un chiffre en dollars et en cents, avec un signe dollar. replaceAll () s'est étouffé dessus, les éléments suivants apparaissant dans une stracktrace:
Dans ce cas, l'utilisateur avait entré "$ 3" quelque part dans son entrée et replaceAll () est allé chercher dans l'expression régulière de recherche pour le troisième groupe correspondant, n'en a pas trouvé un et a vomi.
Donné:
remplacer
avec
résolu le problème. L'utilisateur peut entrer n'importe quel type de caractères, y compris les signes dollar, sans problème. Il s'est comporté exactement comme vous vous y attendez.
la source
Pour avoir un motif protégé, vous pouvez remplacer tous les symboles par "\\\\", à l'exception des chiffres et des lettres. Et après cela, vous pouvez mettre dans ce motif protégé vos symboles spéciaux pour que ce motif ne fonctionne pas comme un texte cité stupide, mais vraiment comme un motif, mais le vôtre. Sans symboles spéciaux utilisateur.
la source
Pattern.quote ("blabla") fonctionne bien.
Le Pattern.quote () fonctionne bien. Il entoure la phrase des caractères " \ Q " et " \ E ", et s'il s'échappe "\ Q" et "\ E". Cependant, si vous devez faire un véritable échappement d'expression régulière (ou échappement personnalisé), vous pouvez utiliser ce code:
Cette méthode renvoie: Some / \ s / wText * / \, **
Code par exemple et tests:
la source
Le symbole ^ (négation) est utilisé pour faire correspondre quelque chose qui n'est pas dans le groupe de caractères.
Ceci est le lien vers les expressions régulières
Voici les informations d'image sur la négation:
la source