Что такое регулярное выражение для соответствия только пустой строке?
Есть много сообщений о регулярных выражениях для сопоставления потенциально пустой строки, но я не мог с легкостью найти какие-либо выражения с регулярным выражением, которые соответствуют только пустой строке.
Я знаю, что ^
будет соответствовать началу любой строки, а $
будет соответствовать концу любой строки, а также концу строки. Таким образом, /^$/
соответствует гораздо большему, чем пустая строка, такая как "\n", "foobar\n\n" и т.д.
Я бы подумал, что /\A\Z/
будет соответствовать только пустой строке, так как \A
соответствует началу строки, а \Z
соответствует концу строки. Однако мое тестирование показывает, что /\A\Z/
также будет соответствовать "\n". Почему это?
Ответы
Ответ 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&._] + $ | ^ $/