Regex в JAVA не более одной точки - PullRequest
1 голос
/ 14 июня 2011

Я ожидаю: \b([a-zA-Z]+\.?)\b or \b([a-zA-Z]+\.{0,1})\b будет работать как минимум с одной буквой и не более чем с одной точкой.

Но средство сравнения находит "ab" с помощью ввода "ab", "ab." и "ab ..", и я ожидаю, что это сделает следующее:

"ab" is found for input "ab"
"ab." is found for input "ab."
nothing is found for input "ab.."

Если я заменим регулярное выражение на 0 вместо точки, например \b([a-zA-Z]+0?)\b чем работает, как и ожидалось:

"ab" is found for input "ab"
"ab0" is found for input "ab0"
nothing is found for input "ab00"

Итак, как мне заставить мое регулярное выражение работать?

Ответы [ 2 ]

5 голосов
/ 14 июня 2011

Проблема в том, что \b соответствует между символами слова и несловесными символами, а не между пробелами и непробелами, как вы, кажется, пытаетесь.Разница между . и 0 заключается в том, что 0 считается символом "слова", а . - это не

. То, что происходит в ваших примерах, таково:

Давайте возьмем эту последнюю строку ab.. и посмотрим, где \b может соответствовать:

   a b . .
  ^ x ^ x x

Помните, \b соответствует между символами.Я показал, где \b может совпадать с ^, а где нет с x.Поскольку \b может совпадать только перед a или сразу после b, мы ограничены только совпадением ab, если у вас есть эти \b биты.

Iдумаю, что вы хотите что-то вроде \bab\.?(?!\S).Там написано: «граница слова, затем a, затем b, а затем, возможно, одна точка, в которой сразу же после НЕ НЕ находится пробел».

Если я неправильно понял ваш вопрос, и вы хотитевыражение для поиска ab. в строке ab.c или для поиска ab в abc вы можете сделать \bab\.?(?!\.)

0 голосов
/ 14 июня 2011
  • \b([a-zA-Z]+\.+)\b - это "хотя бы одна буква, за которой следует хотя бы одна точка
  • \b([a-zA-Z]+\.{0,1})\b - это "хотя бы одна буква, за которой следует ноль или одна точка
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...