2011-12-20 4 views
0

Veuillez noter les espaces dans le regx! En tout cas merci à tous ceux qui essaient de contribuer. Avec des espaces, c'est vraiment difficile je suppose.Que signifie cette expression régulière: \ d {3} - \ d {4}. *

J'ai vu le code actuel a les éléments suivants:

Perl5Compiler compiler = new Perl5Compiler(); 
Perl5Matcher matcher = new Perl5Matcher(); 
Pattern pattern = compiler.compile("\\ d{ 3 } -\\d{4}.* "); // pattern for string starting with " 00 0 - 00 0 0 " 

if (matcher.matches(Num, pattern)) { 
    return true; 
} 

Cependant, je ne pense pas que le droit "\\ d{ 3 } -\\d{4}.* " correspondra " 00 0 - 00 0 0 ". Quelqu'un sait ce que le sens réel de cette expression régulière? Ou d'un autre point de vue, quelle est la regex correcte pour "00 0 - 00 0 0"?

+1

Etes-vous sûr qu'il est '\\ d' et non' \\ d'? –

+0

Oui, j'en suis sûr. Cependant, cela pourrait aussi être un bug existant. Savez-vous ce que "\\ d {3} - \\ d {4}. *" Signifie à la place? – Mike

+1

Re "Avec les espaces, c'est vraiment difficile je suppose.", Non, avec des espaces c'est de la poubelle. – ikegami

Répondre

2

Ces personnes sont correctes qu'il corresponde ###-####

Mais ils oublient d'expliquer la .* ce qui signifie essentiellement « autre chose », le . représente un caractère à l'exception du saut de ligne.

Cela n'a pas beaucoup d'impact sur le succès de la regex, mais elle empêche l'expression régulière de s'étendre sur plusieurs nouvelles lignes quand elle correspond. Ceci est généralement idéal, selon que vous attendez de nouvelles entrées dans votre entrée et ce qu'ils signifient évidemment.

EDIT: Tout d'abord, l'expression rationnelle éditée ne compilera pas en Java avec des espaces entre les {} De plus, les espaces sont vides de sens à l'intérieur de là, il est à la recherche que pour la quantification des nombres.

Donc, en supposant que vous retirez ces espaces d'entre les {} il correspond

" ddd -#### "

« d » dans ce cas est tout à fait littéralement la lettre « d » et « # » à nouveau est un chiffre valeur. Encore une fois, cela est éventuellement suivi par n'importe quoi à cause de .*. Mais maintenant, car il y a un espace supplémentaire après le .* la chaîne correspondante doit également se terminer avec au moins un espace ....C'est une expression assez inutile cependant, êtes-vous sûr que vous voulez interpréter ce premier d littéralement ?? Peut-être que vous devriez vérifier votre syntaxe nouveau .....

En outre, fait amusant, il n'y a pas besoin d'échapper le premier espace, votre regex

"\\ d{3} -\\d{4}.* " est syntaxiquement équivalent à " d{3} -\\d{4}.* "

+0

s'il vous plaît voir la question à nouveau, merci – Mike

+0

Je vois les différences, mais je pense que votre regex a encore des erreurs, voir mes modifications. – gnomed

+0

Je suis surtout satisfait de celui-ci. – Mike

1

Cette expression rationnelle (si les espaces sont supprimés) va correspondre à une expression de la forme

###-#### 

Lorsque # représente un chiffre et -- signifie littéralement.

+0

question récupérée à l'original. s'il vous plaît jeter un oeil – Mike

1

Il semble que (avec des espaces supprimés), il est supposé correspondre à un numéro de téléphone (sans le code de pays et l'indicatif régional).

\d{3}-\d{4} signifie <three digits>-<four digits>, ou XXX-XXXX (où chaque X est un chiffre).

+0

s'il vous plaît voir la question à nouveau, merci. Il ne s'agit pas de numéro de téléphone, mais de ce que le client peut saisir dans le champ de recherche. – Mike

1

Ceci est une utilisation de Jakarta Oro (qui a été retiré pendant deux ans BTW). La seule chose que je peux voir pour cela est que les espaces ont été complètement foirés, parce que si vous prenez l'expression régulière ^\d{3}-\d{4}.*$, cela correspond à ce que le commentaire (espace-contesté) dit, c'est à dire toute chaîne commençant par trois chiffres, puis un trait d'union, puis 4 chiffres.

et notez que .matches() est un abus de langage (et sont donc .matches() méthodes de Java pour cette matière) car il tente de faire correspondre l'entrée ensemble, ce qui est la définition de correspondance des expressions rationnelles (et qui est la raison pour laquelle je mouillais le regex).

+0

s'il vous plaît voir la question à nouveau, merci – Mike

+0

Eh bien, la seule chose que je vois est que oro utilise le modificateur '/ x' de perl par défaut, et que le commentaire est en effet un problème d'espace. – fge

+0

Même avec/x, '\ d {3}' n'est pas la même chose que '\ d {3}'. – ikegami

4

La chaîne littérale

"\\d{3}-\\d{4}.*" 

produit la chaîne

\d{3}-\d{4}.* 

Lorsqu'il est utilisé comme modèle de regex Perl5Matcher, il correspond à des chaînes qui

  1. Commence par 3 chiffres *
  2. suivi d'un tiret
  3. Suivi par 4 chiffres
  4. Suivi par 0 ou plusieurs caractères qui aren 't newlines **
  5. Suivie de la fin de la chaîne.

Par exemple,

  • 123-1234: match de
  • 123-1234XYZ: match de
  • 123-1A34: pas de match
  • 1234-123: pas de match
  • X123-1234: pas de match

* — En Perl, un chiffre est un caractère Unicode avec le "nombre décimal" Catégorie Général. En Unicode 6.0, il y a 420 de ces caractères, y compris 0 à 9. Je ne sais pas exactement quels caractères correspondent \d lors de l'utilisation de la bibliothèque Perl5Matcher. Utilisez [0-9] au lieu de \d pour correspondre uniquement 0 à 9. Par défaut, correspond à n'importe quel caractère à l'exception d'un saut de ligne. Perl5Compiler peut être dit que . devrait correspondre à n'importe quel caractère comprenant un saut de ligne.

+0

Serais-tu capable de revoir la question? Les questions originales viennent avec des espaces autour de ces expressions régulières. – Mike

+0

@Mike, Les espaces ont sûrement été ajoutés par accident à un moment donné. Se débarrasser d'eux. – ikegami

+0

Merci. Je pense que tu as raison. C'est un bug existant. Confirmer que c'est un bug m'aide. – Mike

Questions connexes