2010-12-16 2 views
11

Je dois faire correspondre lorsqu'une chaîne commence par un nombre, puis un point suit, puis un espace et 1 ou plusieurs caractères majuscules. La correspondance doit avoir lieu au début de la chaîne. J'ai la chaîne suivante.Correspondance d'expression régulière Java

1. PTYU fmmflksfkslfsm 

L'expression régulière que j'ai essayé avec est:

^\d+[.]\s{1}[A-Z]+ 

Et il ne correspond pas. Que serait une expression régulière de travail pour ce problème?

+0

[Correspondances pour moi] (http://regexpal.com/?flags=®ex=\\d%2B [.] \ S {1} [AZ]% 2B & input = 1.% 20PTYU% 20fmmflksfkslfsm) mais pourrait être réécrit en '^ \ d + \.\ s [A-Z] + ' –

+2

' {1} 'est redondant: il encombre seulement l'expression et peut (doit) être supprimé en faveur de la clarté. –

+1

En savoir plus sur Java et regex: http://www.regular-expressions.info/java.html. @AlexR et @codaddict ont tous les deux raison. Vous devez utiliser '\\' en Java pour créer un '\'. –

Répondre

26

(Désolé pour mon erreur antérieure du cerveau maintenant fermement engagé Er, probablement...)

Cela fonctionne:

String rex = "^\\d+\\.\\s\\p{Lu}+.*"; 

System.out.println("1. PTYU fmmflksfkslfsm".matches(rex)); 
// true 

System.out.println(". PTYU fmmflksfkslfsm".matches(rex)); 
// false, missing leading digit 

System.out.println("1.PTYU fmmflksfkslfsm".matches(rex)); 
// false, missing space after . 

System.out.println("1. xPTYU fmmflksfkslfsm".matches(rex)); 
// false, lower case letter before the upper case letters 

Décomposant:

  • ^ = Démarrer de la chaîne
  • \d+ = Un ou plusieurs chiffres (le \ réchappés parce qu'il est dans une chaîne, donc \\)
  • \. = A . (ou votre [.] d'origine est très bien) littérale (encore une fois, se sont échappés dans la chaîne)
  • \s = Un omble chevalier blancs (pas besoin de l'{1} après) (je vais arrêter de mentionner les évasions maintenant)
  • \p{Lu}+ = Un ou plusieurs lettres majuscules (en utilisant l'échappement Unicode approprié   — merci, tchrist, pour le signaler dans votre commentaire ci-dessous. En termes anglais, l'équivalent serait [A-Z]+)
  • .* = Tout le reste

Voir the documentation here pour plus de détails.

Vous avez seulement besoin du .* à la fin si vous utilisez une méthode comme String#match (ci-dessus) qui va essayer de correspondre à la chaîne entière.

+1

Il est difficile de dire si les OP sont bloqués en utilisant des données ASCII 7 bits, ou s'il en a besoin pour travailler sur des caractères Java - qui sont Unicode, pas ASCII. Si ce dernier, vous devez bien sûr faire des ajustements. '\ p {Lu}' est probablement assez bon pour les lettres majuscules, mais Java n'offre pas de moyen pratique de parler des espaces Unicode, donc vous devez écrire '[\ u000A- \ u000D \ u0020 \ u0085 \ u00A0 \ u1680 \ u003e \ u2000- \ u00a0 \ u00a0 \ u00a0 \ u00a0 \ u00a0 \ u00b \ u00a0 \ u003e \ u00a0, comme [j'ai d \ u00e9crit ailleurs] (http://stackoverflow.com/questions/4304928/unicode-equivalents-for-w-and-b-in -java-expressions-régulières/4307261 # 4307261). – tchrist

+1

On ne devrait vraiment pas dire que '[A-Z] +' correspond '' une ou plusieurs lettres majuscules '', parce que c'est ce que '\ p {Lu} +' fait. '[A-Z] +' correspond simplement à un ou plusieurs (et préfère plus) de A à Z - que je tiens pour légèrement mais significativement différent. De même, '\ s' n'est pas un caractère blanc, mais plutôt un [\ t \ n \ x0B \ f \ r]' seulement. Suis-je juste trop compliqué ici? Je travaille sur d'immenses corpus de gigaoctets de caractères Unicode - mais jamais ASCII - tous les jours en utilisant à la fois Java et Perl, donc peut-être que je dois être plus prudent que d'autres. Ou peut être pas? – tchrist

+1

@tchrist: ** très, très bons points ** Je ne peux pas croire que j'ai fait quelque chose d'aussi centré sur l'anglais. J'ai coché d'autres personnes pour ça. J'apprécie beaucoup que tu me coches pour ça !! –

1

Il dépend de la méthode que vous utilisez. Je pense que cela fonctionnera si vous utilisez Matcher.find(). Cela ne fonctionnera pas si vous utilisez Matcher.matches() car la correspondance fonctionne sur toute la ligne. Si vous utilisez matchs() fixer votre modèle comme suit:

^\d+\.\s{1}[A-Z]+.* 

(attention sur .* arrière)

Et j'utilise aussi \. au lieu de [.]. C'est plus lisible.

Questions connexes