J'utilise des expressions régulières Java dans Java 1.6 (pour analyser la sortie numérique, entre autres) et je ne trouve pas de définition précise de \b
("word boundary"). J'avais supposé que ce -12
serait un "mot entier" (correspondant à \b\-?\d+\b
) mais il semble que cela ne fonctionne pas. Je serais reconnaissant de connaître les moyens de faire correspondre les nombres séparés par des espaces.
Exemple:
Pattern pattern = Pattern.compile("\\s*\\b\\-?\\d+\\s*");
String plus = " 12 ";
System.out.println(""+pattern.matcher(plus).matches());
String minus = " -12 ";
System.out.println(""+pattern.matcher(minus).matches());
pattern = Pattern.compile("\\s*\\-?\\d+\\s*");
System.out.println(""+pattern.matcher(minus).matches());
Cela renvoie:
true
false
true
regex
word-boundary
peter.murray.rust
la source
la source
Réponses:
Une limite de mot, dans la plupart des dialectes regex, est une position entre
\w
et\W
(caractère non-mot), ou au début ou à la fin d'une chaîne si elle commence ou se termine (respectivement) par un caractère de mot ([0-9A-Za-z_]
).Ainsi, dans la chaîne
"-12"
, il correspondrait avant le 1 ou après le 2. Le tiret n'est pas un caractère de mot.la source
\b
est une assertion de largeur nulle qui correspond s'il y\w
en a d'un côté et qu'il y\W
en a de l'autre ou que la position est le début ou la fin de la chaîne.\w
est arbitrairement défini comme étant des caractères "identificateurs" (alnums et traits de soulignement), pas comme quelque chose de particulièrement utile pour l'anglais.\bhello\b
sans utiliser\b
(en utilisant\w
,\W
et autres)?(^|\W)hello($|\W)
sauf qu'il ne capturerait aucun caractère non-mot avant et après, donc ce serait plutôt(^|(?<=\W))hello($|(?=\W))
(en utilisant des assertions lookahead / lookbehind).(?<!\w)hello(?!\w)
.Une limite de mot peut apparaître dans l'une des trois positions suivantes:
Les caractères des mots sont alphanumériques; un signe moins ne l'est pas. Pris à partir de didacticiel Regex .
la source
Au cours de l'apprentissage de l'expression régulière, j'étais vraiment coincé dans le métacaractère qui est
\b
. Je n'ai en effet pas compris sa signification en me demandant « ce que c'est, ce que c'est » de façon répétitive. Après quelques tentatives d'utilisation du site Web , je fais attention aux tirets verticaux roses à chaque début et à la fin des mots. Je l'ai bien compris à ce moment-là. C'est maintenant exactement la limite du mot (\w
) .Mon point de vue est simplement axé sur la compréhension immensément. La logique derrière cela devrait être examinée à partir d'une autre réponse.
la source
Une limite de mot est une position qui est soit précédée d'un caractère de mot et non suivie d'un caractère, soit suivie d'un caractère de mot et non précédée d'un seul.
la source
Je parle de ce que les
\b
limites de regex -style sont réellement ici .En bref, ils sont conditionnels . Leur comportement dépend de ce qu'ils côtoient.
Parfois, ce n'est pas ce que vous voulez. Voir mon autre réponse pour élaboration.
la source
Je voudrais expliquer la réponse d' Alan Moore
Supposons que j'ai une chaîne "Ceci est un c a t, et elle est un génial", et je suis censé remplacer toutes les occurrences par la lettre 'a' uniquement si cette lettre existe à la "limite d'un mot" , ie la lettre
a
à l'intérieur de «chat» ne doit pas être remplacée.Je vais donc exécuter regex (en Python ) comme
re.sub("\ba","e", myString.strip())
// remplacera
pare
de sorte que la sortie sera Ceci est
e
c un te
e elle dee
wesomela source
Je suis tombé sur un problème encore pire lorsque le texte recherche des mots comme
.NET
,C++
,C#
etC
. On pourrait penser que les programmeurs informatiques sauraient mieux que de nommer un langage pour lequel il est difficile d'écrire des expressions régulières.Quoi qu'il en soit, c'est ce que j'ai découvert (résumé principalement de http://www.regular-expressions.info , qui est un excellent site): Dans la plupart des versions de regex, les caractères qui correspondent à la classe de caractères abrégés
\w
sont les les caractères qui sont traités comme des caractères de mots par des limites de mots. Java est une exception. Java prend en charge Unicode pour\b
mais pas pour\w
. (Je suis sûr qu'il y avait une bonne raison à cela à l'époque).Le
\w
signifie «caractère de mot». Il correspond toujours aux caractères ASCII[A-Za-z0-9_]
. Notez l'inclusion du trait de soulignement et des chiffres (mais pas du tiret!). Dans la plupart des versions qui prennent en charge Unicode,\w
inclut de nombreux caractères d'autres scripts. Il y a beaucoup d'incohérences sur les caractères réellement inclus. Les lettres et les chiffres des scripts alphabétiques et des idéogrammes sont généralement inclus. La ponctuation du connecteur autre que le trait de soulignement et les symboles numériques qui ne sont pas des chiffres peuvent ou non être inclus. XML Schema et XPath incluent même tous les symboles dans\w
. Mais Java, JavaScript et PCRE ne correspondent qu'aux caractères ASCII avec\w
.C'est pourquoi les regex basées sur Java recherchent
C++
,C#
ou.NET
(même si vous vous souvenez d'échapper au point et aux avantages) sont vissées par le\b
.Remarque: je ne sais pas quoi faire en cas d'erreurs de texte, comme lorsque quelqu'un ne met pas d'espace après un point à la fin d'une phrase. Je l'ai permis, mais je ne suis pas sûr que ce soit nécessairement la bonne chose à faire.
Quoi qu'il en soit, en Java, si vous recherchez du texte pour ces langages aux noms étranges, vous devez remplacer le
\b
par des indicateurs d'espaces et de ponctuation avant et après. Par exemple:Puis dans votre test ou fonction principale:
PS Mes remerciements à http://regexpal.com/ sans qui le monde des regex serait très misérable!
la source
C#
mais maintenant c'est plus clairConsultez la documentation sur les conditions aux limites:
http://java.sun.com/docs/books/tutorial/essential/regex/bounds.html
Découvrez cet exemple:
Lorsque vous l'imprimez, notez que la sortie est la suivante:
[J'ai trouvé la valeur -, dans ma chaîne.]
Cela signifie que le caractère "-" n'est pas sélectionné comme étant à la limite d'un mot car il n'est pas considéré comme un caractère de mot. On dirait que @brianary m'a un peu battu, alors il obtient un vote positif.
la source
La limite de mot \ b est utilisée où un mot doit être un caractère de mot et un autre un caractère non-mot. L'expression régulière pour un nombre négatif doit être
vérifier le fonctionnement DEMO
la source
Je crois que votre problème est dû au fait que ce
-
n'est pas un caractère de mot. Ainsi, la limite du mot correspondra après le-
, et ne la capturera donc pas. Les limites de mot correspondent avant le premier et après le dernier caractère de mot dans une chaîne, ainsi que tout endroit où avant il se trouve un caractère de mot ou un caractère non-mot, et après c'est le contraire. Notez également que la limite de mot est une correspondance de largeur nulle.Une alternative possible est
Cela correspondra à tous les nombres commençant par un caractère espace et un tiret facultatif, et se terminant à une limite de mot. Il correspondra également à un nombre commençant au début de la chaîne.
la source
Je pense que c'est la limite (c'est-à-dire le caractère suivant) de la dernière correspondance ou le début ou la fin de la chaîne.
la source
\G
: correspond au début de la chaîne (comme\A
) lors de la première tentative de correspondance; après cela, il correspond à la position où le match précédent s'est terminé.lorsque vous utilisez
\\b(\\w+)+\\b
cela signifie une correspondance exacte avec un mot contenant uniquement des caractères de mot([a-zA-Z0-9])
dans votre cas, par exemple, définir
\\b
au début de l'expression régulière acceptera-12
(avec espace) mais encore une fois, il n'acceptera pas-12
(sans espace)pour référence à l'appui de mes propos: https://docs.oracle.com/javase/tutorial/essential/regex/bounds.html
la source