Подтвердить что ты не робот

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

Есть много сообщений о регулярных выражениях для сопоставления потенциально пустой строки, но я не мог с легкостью найти какие-либо выражения с регулярным выражением, которые соответствуют только пустой строке.

Я знаю, что ^ будет соответствовать началу любой строки, а $ будет соответствовать концу любой строки, а также концу строки. Таким образом, /^$/ соответствует гораздо большему, чем пустая строка, такая как "\n", "foobar\n\n" и т.д.

Я бы подумал, что /\A\Z/ будет соответствовать только пустой строке, так как \A соответствует началу строки, а \Z соответствует концу строки. Однако мое тестирование показывает, что /\A\Z/ также будет соответствовать "\n". Почему это?

4b9b3361

Ответ 1

Как объясняется в http://www.regular-expressions.info/anchors.html в разделе "Строки, заканчивающиеся с разрывом строки", \Z обычно будет соответствовать до конца последняя строка в строках, заканчивающаяся символом новой строки. Если вы хотите совместить только конец строки, вам нужно использовать \Z. Исключением из этого правила является Python.

Другими словами, чтобы точно соответствовать пустой строке, вам нужно использовать /\A\z/.

Ответ 2

Я бы использовал негативный прогноз для любого char:

^(?![\s\S])

Это может быть только в том случае, если вход полностью пуст, потому что класс символов будет соответствовать любому char, включая любой из символов новой строки.

Ответ 3

Я считаю, что Python - единственный широко используемый язык, который не поддерживает \z таким образом (пока). Есть Связывание с Python для быстрой версии re2 С++-библиотеки Russ Cox/Google, которая может быть "удалена" в качестве замены для связанного re.

Отличное обсуждение (с обходными решениями) для этого в Perl Compatible Regular Expression (PCRE) в Python, здесь, на SO.

python
Python 2.7.11 (default, Jan 16 2016, 01:14:05) 
[GCC 4.2.1 Compatible FreeBSD Clang 3.4.1 on freebsd10
Type "help", "copyright", "credits" or "license" for more information.
>>> import re2 as re
>>> 
>>> re.match(r'\A\z', "")
<re2.Match object at 0x805d97170>

@tchrist answer стоит прочитать.

Ответ 4

Ответ может быть зависимым от языка, но поскольку вы не упоминаете его, вот что я только что придумал в js:

 var a = ['1','','2','','3'].join('\n');

 console.log(a.match(/^.{0}$/gm)); // ["", ""]

 // the "." is for readability. it doesn't really matter
 a.match(/^[you can put whatever the hell you want and this will also work just the same]{0}$/gm)

Вы также можете сделать a.match(/^(.{10,}|.{0})$/gm) для соответствия пустым строкам ИЛИ строкам, соответствующим критериям. (Это то, что я искал, чтобы закончить здесь.)

Я знаю, что ^ будет соответствовать началу любой строки, а $будет соответствовать концу любой строки

Это верно, только если у вас включен многострочный флаг, иначе он будет соответствовать началу/концу строки. Я предполагаю, что вы это знаете и подразумеваете это, но хотели бы отметить его здесь для учащихся.

Ответ 5

Попробуйте посмотреть здесь: https://docs.python.org/2/library/re.html

Я столкнулся с той же проблемой, что и у вас. Я мог бы создать только регулярное выражение, которое будет соответствовать только пустой строке, а также "\n". Попробуйте обрезать/заменить символы новой строки в строке другим символом.

Я использовал http://pythex.org/ и искал странные регулярные выражения, подобные этим:

()

(?:)

^$

^(?:^\n){0}$

и т.д.

Ответ 6

Ух ты, ты думаешь об этом. Это так же просто, как следующее. Кроме того, многие из этих ответов не поняты диалектом RE2, используемым Си и Голангом.

^$

Ответ 7

Основываясь на наиболее одобренном ответе, вот еще один способ:

var result = !/[\d\D]/.test(string);  //[\d\D] will match any character

Ответ 8

^ $ - регулярное выражение для принятия пустой строки. И оно не будет соответствовать "/n" или "foobar/n", как вы упомянули. Вы можете проверить это регулярное выражение на https://www.regextester.com/1924.

Если у вас есть существующее регулярное выражение, используйте или (|) в своем регулярном выражении для совпадения с пустой строкой. Например, /^[A-Za-z0-9&._] + $ | ^ $/