Могу ли я поместить утверждение в класс символов в регулярном выражении?

Я хочу написать регулярное выражение, которое соответствует строкам, содержащим буквы, пробелы и цифры, за которыми следуют точки. Числа могут появляться в любом месте строки, и их может быть несколько. Например:

Foo            -> Match
Foo Bar        -> Match
Foo 1 Bar      -> No Match
Foo 1. Bar     -> Match
Foo 11. Bar    -> Match
1. Foo 11. Bar -> Match

Я знаю, что могу сопоставлять буквы и пробелы с помощью [a-zA-Z ]+, а цифры, за которыми следует точка, с помощью \d+(?=\.). Но когда я вставляю последнее в первое, оно соответствует всем числам, а также буквальным символам «+», «(», «?», «=», «.» и «)».

Есть ли способ добиться этого?

Нет, это надо делать типа ^(?:\d+\.|[a-zA-Z ])*$

Wiktor Stribiżew 16.04.2024 14:40

А как насчет пустых строк? Если это разрешено, развернуто : ^[a-zA-Z ]*(?:\d+\.[a-zA-Z ]*)*$

bobble bubble 16.04.2024 18:26
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
2
55
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Классы символов предназначены для сопоставления символов, вы не можете помещать утверждения нулевой ширины в классы символов. Обратите внимание, как \b теряет значение границы слова внутри класса символов и начинает соответствовать символам возврата (по крайней мере, в большинстве разновидностей регулярных выражений).

В этом случае вы можете сопоставить ноль или более вхождений одной или нескольких цифр с точкой сразу после или с разрешенными вами символами:

^(?:\d+\.|[a-zA-Z ])*$

Посмотрите демонстрацию регулярных выражений . Если пустая строка недопустима, замените * на + перед привязкой $.

Подробности:

  • ^ — начало строки
  • (?:\d+\.|[a-zA-Z ])* - ноль и более повторений
    • \d+\. — одна или несколько цифр, а затем .
    • [a-zA-Z ] — буква ASCII или обычный пробел.
  • $ — конец строки.

В Java-коде нет необходимости использовать ^ и $ с String.matches():

text.matches("(?:\\d+\\.|[a-zA-Z ])*")

Другие вопросы по теме