Я хочу написать регулярное выражение, которое соответствует строкам, содержащим буквы, пробелы и цифры, за которыми следуют точки. Числа могут появляться в любом месте строки, и их может быть несколько. Например:
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+(?=\.)
. Но когда я вставляю последнее в первое, оно соответствует всем числам, а также буквальным символам «+», «(», «?», «=», «.» и «)».
Есть ли способ добиться этого?
А как насчет пустых строк? Если это разрешено, развернуто : ^[a-zA-Z ]*(?:\d+\.[a-zA-Z ]*)*$
Классы символов предназначены для сопоставления символов, вы не можете помещать утверждения нулевой ширины в классы символов. Обратите внимание, как \b
теряет значение границы слова внутри класса символов и начинает соответствовать символам возврата (по крайней мере, в большинстве разновидностей регулярных выражений).
В этом случае вы можете сопоставить ноль или более вхождений одной или нескольких цифр с точкой сразу после или с разрешенными вами символами:
^(?:\d+\.|[a-zA-Z ])*$
Посмотрите демонстрацию регулярных выражений . Если пустая строка недопустима, замените *
на +
перед привязкой $
.
Подробности:
^
— начало строки(?:\d+\.|[a-zA-Z ])*
- ноль и более повторений
\d+\.
— одна или несколько цифр, а затем .
[a-zA-Z ]
— буква ASCII или обычный пробел.$
— конец строки.В Java-коде нет необходимости использовать ^
и $
с String.matches()
:
text.matches("(?:\\d+\\.|[a-zA-Z ])*")
Нет, это надо делать типа
^(?:\d+\.|[a-zA-Z ])*$