【问题标题】:What is a regex to match ONLY an empty string?什么是仅匹配空字符串的正则表达式?
【发布时间】:2013-10-08 06:34:26
【问题描述】:

有很多关于正则表达式匹配可能空字符串的帖子,但我找不到任何提供匹配空字符串的正则表达式。

我知道^ 将匹配任何行的开头,$ 将匹配任何行的结尾以及字符串的结尾。因此,/^$/ 匹配的内容远远超过空字符串,例如“\n”、“foobar\n\n”等。

不过,我原以为/\A\Z/ 将只匹配空字符串,因为\A 匹配字符串的开头,\Z 匹配字符串的结尾。但是,我的测试表明/\A\Z/ 也将匹配“\n”。这是为什么呢?

【问题讨论】:

  • 有很多SO posts关于正则表达式来匹配一个空字符串,所以粗略一看,它似乎可能是重复的。考虑更改您的标题以更具体地解决您忽略换行符的问题。
  • 这是一篇关于正则表达式的帖子,它 将空字符串与一组关于原因的答案相匹配。我真的尝试过,但找不到关于只匹配空字符串的正则表达式的帖子,更不用说处理这个问题的帖子以及\z\Z 之间的区别了。我不想弄乱SO。如果你能找到一个重复的问题,我很乐意删除这个问题。也就是说,我在这个标题中强调了“仅”这个词。
  • 删除多行标志,^$ 应该可以工作
  • @JamRisser 我了解与多行模式的交互。我应该是明确的,但我问的是一个正则表达式只匹配一个空字符串in multiline mode。请特别注意最后一段。

标签: regex string


【解决方案1】:

我会对任何字符使用负前瞻:

^(?![\s\S])

这只能在输入完全为空的情况下匹配,因为字符类将匹配任何字符,包括任何各种换行符。

【讨论】:

  • 你不能用.代替[\s\S]吗?
  • @mbom 如果你启用了 DOTALL 标志,你可以,所以点也匹配换行符,但这样它在任何地方都可以工作,即使标志不可用。
  • 这实际上不起作用,因为它匹配所有内容,例如在 JavaScript 命令行 RegExp('^(?![\s\S])').test('Hello World!') 返回 true
  • @JonathanBenn 这实际上确实工作,如果你正确地执行它。在 JavaScript 控制台中:RegExp(/^(?![\s\S])/).test('') -> trueRegExp(/^(?![\s\S])/).test('Hello World!') -> false
  • @Bohemian 你是对的!我今天刚学到一些东西...根据Mozilla,字符串表达式需要双反斜杠。我应该像你一样使用RegExp('^(?![\\s\\S])') 或文字。
【解决方案2】:

就像下面这样简单。 C 和 golang 使用的 RE2 方言无法理解许多其他答案。

^$

【讨论】:

  • 您是否不同意问题中包含的陈述:“因此,/^$/ 匹配的内容远远超过空字符串,例如“\n”、“foobar\n\n”,等等”?
  • 是的,我不同意这种说法。该语句仅在启用多行标志时才成立。
  • 确保全局标志被禁用可能不会有什么坏处,因为不可能有多个实例。
  • r'^\Z'r'\A\Z' 仅匹配 Python 中的空字符串。 r'^$' 匹配'\n':“默认情况下...'$' [匹配] 仅在字符串末尾and immediately before the newline(如果有)在字符串末尾。”
  • 这其实是正确的答案。在 JavaScript 控制台中,RegExp('^$').test('\n')falseRegExp('^$').test('')true。原始海报必须将多行标志设置为true RegExp('^$','m').test('\n') 等于true
【解决方案3】:

正如http://www.regular-expressions.info/anchors.html 在“以换行符结尾的字符串”部分中解释的那样,\Z 通常会在以换行符结尾的字符串中最后一个换行符的结尾之前匹配。如果只想匹配字符串的结尾,则需要使用\z。此规则的例外是 Python。

也就是说,要独占匹配一个空字符串,你需要使用/\A\z/

【讨论】:

  • 在 Python 2.7.3 中使用 re.match 进行了尝试,但似乎不起作用。 re.match("/\\A\\z/", "") 返回无。
  • 在 JavaScript 控制台 RegExp(/\A\z/).test('') 返回 false
【解决方案4】:

^$ - 正则表达式接受空字符串。它不会匹配你提到的“/n”或“foobar/n”。 你可以在https://www.regextester.com/1924 上测试这个正则表达式。

如果您有现有的正则表达式,请在您的正则表达式中使用 or(|) 来匹配空字符串。 例如 /^[A-Za-z0-9&._]+$|^$/

【讨论】:

    【解决方案5】:

    我相信 Python 是唯一一种不以这种方式支持 \z 的广泛使用的语言(目前)。有Python bindings for Russ Cox / Google's super fast re2 C++ library 可以“放入”以替代捆绑的re

    Perl Compatible Regular Expression (PCRE) in 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's answer 值得一读。

    【讨论】:

      【解决方案6】:

      试试看这里: https://docs.python.org/2/library/re.html

      我遇到了同样的问题。我只能构建一个只匹配空字符串和“\n”的正则表达式。尝试先用另一个字符修剪/替换字符串中的换行符。

      我正在使用http://pythex.org/ 并尝试像这样的奇怪正则表达式:

      ()

      (?:)

      ^$

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

      等等。

      【讨论】:

        【解决方案7】:

        答案可能取决于语言,但由于你没有提到一个,这是我刚刚在 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) 来匹配空行或符合条件的行。 (这就是我想要在这里结束的东西。)

        我知道 ^ 将匹配任何行的开头,而 $ 将匹配任何行的结尾

        仅当您打开多行标志时才如此,否则它将仅匹配字符串的开头/结尾。我假设您知道这一点并暗示这一点,但想在这里为学习者注意。

        【讨论】:

          【解决方案8】:

          根据最受认可的答案,这里还有另一种方法:

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

          【讨论】:

          • 这不是正则表达式。这是一个混合了 JavaScript 的正则表达式。
          【解决方案9】:

          正如@Bohemian 和@mbomb007 之前提到的,这很有效,并且具有更具可读性的额外优势:

          console.log(/^(?!.)/s.test("")); //true

          【讨论】:

            【解决方案10】:

            考虑到空字符串可能包含多个空白字符(例如空格、制表符、换行符)的情况,另一个可能的答案 可以是以下模式。

            pattern = r"^(\s*)$"

            如果字符串以零个或多个空格字符开头和结尾,则此模式匹配。

            在 Python 3 中测试过

            【讨论】:

              【解决方案11】:

              您不是在询问空字符串。正则表达式中的字符串不是字母、数字和标点符号的组合。它是一组 ASCII 字符。所以“\n”不是空字符串。它有一个 ASCII 字符“\n”。 link

              【讨论】:

                猜你喜欢
                • 2010-12-01
                • 1970-01-01
                • 2023-03-13
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2016-01-07
                • 1970-01-01
                相关资源
                最近更新 更多