Я использую регулярные выражения Java в Java 1.6 (помимо прочего, для анализа числового вывода) и не могу найти точное определение \b
(«граница слова»). Я предполагал, что -12
это будет «целое слово» (соответствует \b\-?\d+\b
), но оказалось, что это не работает. Я был бы признателен за информацию о способах сопоставления чисел, разделенных пробелами.
Пример:
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());
Это возвращает:
true
false
true
regex
word-boundary
peter.murray.rust
источник
источник
Ответы:
Граница слова в большинстве диалектов регулярных выражений - это позиция между
\w
и\W
(символ, не являющийся словом), или в начале или конце строки, если она начинается или заканчивается (соответственно) символом слова ([0-9A-Za-z_]
).Таким образом, в строке
"-12"
он будет соответствовать перед 1 или после 2. Тире не является символом слова.источник
\b
- это утверждение нулевой ширины, которое соответствует, если оно есть\w
на одной стороне, и либо есть\W
на другой, либо позиция является началом или концом строки.\w
произвольно определяется как символы "идентификатора" (alnums и подчеркивание), а не как что-то особенно полезное для английского языка.\bhello\b
без использования\b
(используя\w
,\W
и другие)?(^|\W)hello($|\W)
за исключением того, что он не будет захватывать никакие символы, не являющиеся словами, до и после, поэтому это будет больше похоже(^|(?<=\W))hello($|(?=\W))
(с использованием утверждений просмотра вперед / назад).(?<!\w)hello(?!\w)
.Граница слова может находиться в одном из трех положений:
Символы слова являются буквенно-цифровыми; знака минус нет. Взято из учебника Regex .
источник
В процессе изучения регулярных выражений я действительно застрял в метасимволе, которым является
\b
. Я действительно не понимал его значения, когда я неоднократно спрашивал себя « что это такое, что это такое ». После нескольких попыток использования веб-сайта я наблюдаю за розовыми вертикальными черточками в каждом начале слова и в конце слов. Тогда я хорошо понял его смысл. Теперь это точно слово (\w
) -ограничение .Моя точка зрения исключительно ориентирована на понимание. Логику этого следует исследовать из других ответов.
источник
Граница слова - это позиция, которой либо предшествует символ слова и не следует за ним, либо за которой следует символ слова и не предшествует один.
источник
Я говорю о том, какие
\b
границы регулярных выражений здесь на самом деле .Короче говоря, они условны . Их поведение зависит от того, с чем они рядом.
Иногда это не то, что вам нужно. См. Мой другой ответ для уточнения.
источник
Я хотел бы объяснить ответ Алана Мура
Предположим, у меня есть строка «This is a c a t, and she is a wesome», и я должен заменить все вхождения на букву «a», только если эта буква существует на «границе слова» , т. Е. букву
a
внутри «кота» заменять не нужно.Поэтому я буду выполнять регулярное выражение (в Python ) как
re.sub("\ba","e", myString.strip())
// заменитьa
наe
поэтому выход будет это
e
с в т -e
е онаe
wesomeисточник
Я столкнулся с еще худшей проблемой при поиске текста для слов , как
.NET
,C++
,C#
, иC
. Вы могли бы подумать, что программисты лучше знают, чем называть язык тем, для чего трудно писать регулярные выражения.Во всяком случае, вот что я узнал (в основном это обобщено на http://www.regular-expressions.info , это отличный сайт): в большинстве разновидностей регулярных выражений символы, которые соответствуют классу сокращенных символов,
\w
являются символы, которые рассматриваются как символы слова границами слов. Java - исключение. Java поддерживает Unicode для,\b
но не для\w
. (Я уверен, что в то время для этого была веская причина).Это
\w
означает «словесный символ». Он всегда соответствует символам ASCII[A-Za-z0-9_]
. Обратите внимание на наличие символа подчеркивания и цифр (но не тире!). В большинстве разновидностей, поддерживающих Unicode,\w
включает много символов из других скриптов. Есть много противоречий в том, какие символы фактически включены. Буквы и цифры из алфавитных шрифтов и идеограмм обычно включаются. Знаки препинания соединителя, кроме подчеркивания и числовых символов, которые не являются цифрами, могут или не могут быть включены. XML Schema и XPath даже включают все символы в\w
. Но Java, JavaScript и PCRE соответствуют только символам ASCII с\w
.Именно поэтому Java на основе регулярных выражений для поиска
C++
,C#
или.NET
(даже если вы помните , чтобы избежать периода и плюсов) вкручиваются самым\b
.Примечание: я не уверен, что делать с ошибками в тексте, например, когда кто-то не ставит пробел после точки в конце предложения. Я допустил это, но не уверен, что это обязательно правильно.
В любом случае, в Java, если вы ищете текст для этих странно названных языков, вам нужно заменить
\b
пробелы и знаки препинания до и после. Например:Затем в вашей тестовой или основной функции:
PS Мои благодарности http://regexpal.com/, без которого мир регулярных выражений был бы очень жалким!
источник
C#
но теперь стало яснееОзнакомьтесь с документацией по граничным условиям:
http://java.sun.com/docs/books/tutorial/essential/regex/bounds.html
Посмотрите этот образец:
Когда вы распечатываете его, обратите внимание, что на выходе получается следующее:
[Я нашел значение - в своей строке.]
Это означает, что символ «-» не воспринимается как находящийся на границе слова, потому что он не считается символом слова. Похоже, @brianary как бы опередил меня, поэтому он получил голосование "за".
источник
Граница слова \ b используется там, где одно слово должно быть символом слова, а другое - несловесным символом. Регулярное выражение для отрицательного числа должно быть
проверить рабочий DEMO
источник
Я считаю, что ваша проблема связана с тем, что
-
это не словесный символ. Таким образом, граница слова будет соответствовать после-
, и поэтому не будет захватывать ее. Границы слов совпадают перед первым и после последнего символа слова в строке, а также в любом месте, где перед ним стоит символ слова или не-слово, а после - наоборот. Также обратите внимание, что граница слова соответствует нулевой ширине.Одна из возможных альтернатив -
Это будет соответствовать любым числам, начинающимся с пробела и необязательного тире и заканчивающимся границей слова. Он также будет соответствовать номеру, начинающемуся в начале строки.
источник
Я думаю, что это граница (то есть следующий за символом) последнего совпадения или начало или конец строки.
источник
\G
: соответствует началу строки (например\A
) при первой попытке сопоставления; после этого он соответствует позиции, на которой закончился предыдущий матч.при использовании
\\b(\\w+)+\\b
это означает точное совпадение со словом, содержащим только символы слова([a-zA-Z0-9])
в вашем случае, например, настройка
\\b
в начале регулярного выражения примет-12
(с пробелом), но снова не примет-12
(без пробела)для справки в поддержку моих слов: https://docs.oracle.com/javase/tutorial/essential/regex/bounds.html
источник