#java #regex
#java #регулярное выражение
Вопрос:
Я сейчас изучаю регулярное выражение и путаюсь с b
или граница слова определена.
Я знаю, что d
равно [0-9]
и D
равно [^0-9]
, w
равно [a-zA-Z0-9]
и W
равно [^a-zA-Z0-9]
.
Я перепробовал так много разных комбинаций, чтобы создать эквивалент для b
, но безуспешно.
Мой вопрос в том, можем ли мы создать эквивалент b
? Пожалуйста, предоставьте простое объяснение.
Комментарии:
1.
b
допустимо в Java, просто убедитесь, что используете\b
2. Зачем вам нужен эквивалент word boundary? Просто используйте
\b
.3. я не спрашиваю о том, как использовать word boundary, я знаю, что в java вы должны использовать escape char для записи
b
, но я спрашиваю, каков его эквивалент? мне просто любопытно.4. Если бы это было легко воспроизвести,
b
используя какую-либо другую конструкцию,b
это было бы недоступно в первую очередь.5. На самом деле, вы ошибаетесь. Ни одна из ваших замен не верна.
d
не равно[0-9]
, поскольку оно может принимать или не принимать во внимание цифры Юникода (зависит от реализации);w
разрешает_
тоже, поэтомуW
запрещает_
также и т.д.
Ответ №1:
У вас есть несколько вариантов:
Вариант 1: использование как положительных, так и отрицательных поисковых систем
(?:(?<!w)(?=w)|(?<=w)(?!w))
Смотрите демонстрацию.
Вариант 2: использование только положительных поисковых систем
(?:(?<=W|^)(?=w)|(?<=w)(?=W|$))
Смотрите демонстрацию.
Недостаточно проверить, что следующий символ является W
(например), как предполагает другой ответ с (?=W)
, потому что W
должен соответствовать символу, но b
работает в начале или конце строк, где нет символа для сопоставления. Чтобы исправить это, регулярное выражение в варианте 2 вводит чередование с началом и концом строковых утверждений ^
и $
Ответ №2:
Непроверенный эквивалент для b:
(?<=\w)(?=\W)|(?<=\W)(?=\w)
Это утверждения нулевой ширины, позволяющие заглянуть в прошлое и заглянуть вперед. Это то, что происходит на границе слова.