Double barre oblique période de l'expression régulière
J'ai récemment commencé à utiliser des expressions régulières en Java, et j'ai couru dans une étrange expression.
Le problème demande de trouver les "mots" qui sont constitués uniquement de lettres et au plus une conclusion de la période.
Ainsi, par exemple, si j'ai d'entrée de la chaîne:
one two. wr7ng not1 three. nope..
Le moteur va en trouver un, deux et trois, comme les mots correspondants. La solution pour le problème est ce Modèle:
for (String tok : s.split(" ")) {
if (tok.matches("[a-zA-Z]+//.?")) {
//code done to record successful match
}
}
Ce que les deux barres obliques veux dire? J'ai comparé cette expression avec celle-ci:
[a-zA-Z]+.?
Et seul le dernier de manière incorrecte accepté chiffres dans le final de la fente (de la période). Est-ce la seule différence?
C'est peut-être une faute de frappe et qu'ils sont censés être les barres obliques inverses. Barre oblique, à ma connaissance, n'est pas un caractère spécial dans les regex, mais le
.
est et de l'utiliser comme un .
vous avez à s'échapper.OriginalL'auteur jahmezz | 2012-05-27
Vous devez vous connecter pour publier un commentaire.
Êtes-vous sûr que ce n'était pas barres obliques inverses?
Deux barres obliques inverses dans une chaîne littérale signifie, "insérer une barre oblique inverse dans la chaîne littérale". (Par convention, dans de nombreuses langues, barre oblique inverse anychar signifie, "insérer anychar").
Lorsque la chaîne est interprétée comme une expression régulière,
le texte
signifie, "correspond à la période de "comme un caractère littéral".
Si vous n'avez pas la barre oblique inverse "caractère d'échappement", dans la plupart des Regexp moteurs, "correspond à un caractère".
OriginalL'auteur Ira Baxter
Semble que vous ayez une faute de frappe. Il devrait être
"[a-zA-Z]+\\."
.Que la chaîne de valeur devient l'expression régulière de la valeur
[a-zA-Z]+\.
. La barre oblique indique que le.
doit être traité comme un littéral de la période. Sans elle,.
est un spécial expression régulière métacaractère qui correspond à tout seul caractère (y compris les chiffres).OriginalL'auteur Mark Reed
L'exacte RE:
et de le compiler à l'aide de Java, vous avez besoin encore d'une barre oblique inverse \ ce qui signifie un caractère d'échappement dans une Java string:
OriginalL'auteur jaselg
Une barre oblique n'a pas de sens particulier dans une regex, donc, "//" signifie que cela correspond à deux barres obliques.
Si cela ne fait pas sens, c'est soit une faute de frappe, ou que vous avez mal lu ou mal transcrites les regex. L'évident "correction" de remplacement des barres obliques avec des barres obliques inverses donne ça:
qui signifie "le match des lettres romaines suivie par une option de
'.'
". Dans le contexte, que pourrait dire un mot anglais suivies d'un point /période.Pour l'enregistrement,
"[a-zA-Z]+.?"
correspond à 1 ou plusieurs lettres romaines suivi (en option) par un caractère de plus. Le "désir" de la+
opérateur signifie que le caractère facultatif sera un non-lettre ... si quoi que ce soit.OriginalL'auteur Stephen C
À l'aide d'un
.
(dot) sera interprété comme une regex métacaractère qui signifie "n'importe quel caractère".À l'aide de
\.
donnera une erreur de compilation, viz. Illégale Caractère D'ÉchappementÀ l'aide de
\\.
sera interprété comme un simple.
(dot) de caractères, qui est ce que vous avez besoin d'utiliser.Donc, pour un mot qui ne contient que des lettres que vous utilisez
[a-zA-Z]+
où la+
(plus) est un quantificateur qui signifie "un ou plusieurs".Pour un seul
.
(dot) de caractères que vous utilisez\\.
.Maintenant, pour "antérieure au plus une fois" partie de votre
.
(dot) de caractère, vous pourrez utiliser la?
quantificateur qui signifie "un ou plusieurs". Votre expression pour la.
partie devient\\.?
.Donc votre expression regex sera
[a-zA-Z]+\\.?
.OriginalL'auteur Surender Thakran