Каков шаблон для пустой строки? - PullRequest
8 голосов
/ 27 июля 2010

Мне нужно проверить ввод: допустимыми вариантами являются либо число, либо пустая строка. Что такое соответствующее регулярное выражение?

String pattern = "\d+|<what shoudl be here?>";

UPD: не предлагайте "\ d *", пожалуйста, мне просто интересно, как сказать "пустую строку" в регулярном выражении.

Ответы [ 7 ]

15 голосов
/ 27 июля 2010

В данном конкретном случае ^\d*$ будет работать, но, вообще говоря, для соответствия pattern или пустой строке вы можете использовать:

^$|pattern

Пояснение

  • ^ и $ - начало и конец якоря строки соответственно.
  • | используется для обозначения альтернатив, например, this|that.

Ссылки

Смежные вопросы


Примечание о многострочном режиме

В так называемом многострочном режиме (Pattern.MULTILINE/(?m) в Java), ^ и $ соответствуют началу и концу строки .Якоря для начала и конца строки теперь равны \A и \Z соответственно.

Если вы находитесь в многострочном режиме, то вместо пустой строки вместо \A\Z.^$ будет соответствовать пустой строке в строке.


Примеры

Вот несколько примеров, иллюстрирующих вышеприведенные пункты:

String numbers = "012345";

System.out.println(numbers.replaceAll(".", "<$0>"));
// <0><1><2><3><4><5>

System.out.println(numbers.replaceAll("^.", "<$0>"));
// <0>12345

System.out.println(numbers.replaceAll(".$", "<$0>"));
// 01234<5>

numbers = "012\n345\n678";
System.out.println(numbers.replaceAll("^.", "<$0>"));       
// <0>12
// 345
// 678

System.out.println(numbers.replaceAll("(?m)^.", "<$0>"));       
// <0>12
// <3>45
// <6>78

System.out.println(numbers.replaceAll("(?m).\\Z", "<$0>"));     
// 012
// 345
// 67<8>

Замечание по Java matches

В Java matches пытается сопоставить шаблон с всей строкой .

Это верно для String.matches, Pattern.matches и Matcher.matches.

Это означает, что иногда якоря могут быть опущены для Java matches, когда они необходимы в противном случаедля других разновидностей и / или других методов Java regex.

Смежные вопросы

6 голосов
/ 27 июля 2010
/^\d*$/

Совпадает с 0 или более цифрами ни с чем до или после.

Пояснение:

«^» означает начало строки. «$» означает конец строки. '*' соответствует 0 или более вхождениям. Таким образом, шаблон соответствует всей строке с 0 или более цифрами.

3 голосов
/ 27 июля 2010

Чтобы явно указать пустую строку, используйте \A\Z.

Вы также можете часто видеть ^$, который работает нормально, если не установлен параметр, позволяющий привязкам ^ и $ соответствовать не только в начале или конце строки, но также в начале / конце каждая строка. Если ваш ввод никогда не может содержать переводы строки, то, конечно, ^$ совершенно нормально.

Некоторые разновидности регулярных выражений не поддерживают привязки \A и \Z (особенно JavaScript).

Если вы хотите разрешить «пусто» как «ничего или только пробел», то перейдите к \A\s*\Z или ^\s*$.

1 голос
/ 27 июля 2010

Как забавное решение, вы можете сделать:

\d+|\d{0}

Цифра, ноль раз. Да, это работает.

0 голосов
/ 04 ноября 2016

Чтобы сделать любой шаблон, который соответствует всей строке, необязательным, т. Е. Разрешить шаблону соответствовать пустой строке, используйте необязательную группу :

^(pattern)?$
^^       ^^^

См. Демоверсию regex

Если механизм регулярных выражений разрешает (как в Java), предпочитает группу без захвата, так как ее основное назначение - группировать только подшаблоны, а не сохранять захваченные подзначения:

^(?:pattern)?$

^ будет соответствовать началу строки (или \A может использоваться во многих вариантах для этого), $ будет соответствовать концу строки (или \z может использоваться, чтобы соответствовать заканчиваются во многих вариантах, и Java тоже), и (....)? будет соответствовать 1 или 0 (из-за квантификатора ?) последовательностей подшаблонов в скобках.

Примечание по использованию Java: при использовании в matches() начальный ^ и конечный $ могут быть опущены, и вы можете использовать

String pattern = "(?:\d+)?";
0 голосов
/ 17 сентября 2015

Один из способов просмотра на множестве регулярных языков как закрытие следующих вещей:

  1. Специальный - это обычный язык
  2. Любой символ из alphaphet является действительным обычным языком
  3. Любая конкатенация и объединение двух действительных регулярных выражений является обычным языком
  4. Любой союз двух действительных регулярных языков является обычным языком
  5. Любое транзитивное замыкание регулярного выражения является регулярным языком

Конкретный регулярный язык является конкретным элементом этого замыкания.


Я не нашел пустой символ в стандарте POSIX , чтобы выразить идею обычного языка из шага (1).

Но существует такая вещь, как вопросительный знак, который по определению posix следующий:

(регулярное выражение | )

Таким образом, вы можете сделать следующее для bash, perl и python:

echo 9023 | grep -E "(1|90)?23"
perl -e "print 'PASS' if (qq(23) =~ /(1|90)?23/)"
python -c "import re; print bool(re.match('^(1|90)?23$', '23'))"
0 голосов
/ 27 июля 2010

Не должно быть ничего плохого, просто "\d+|"

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...