【问题标题】:Regular Expressions- Match Anything正则表达式 - 匹配任何东西
【发布时间】:2020-10-13 14:54:34
【问题描述】:

如何使表达式完全匹配任何内容(包括空格)?
示例:

正则表达式:我买了_____羊。

火柴:我买了羊。我买了一只羊。我买了五只羊。

我尝试使用(.*),但这似乎不起作用。

【问题讨论】:

  • .* 应该可以工作。你能粘贴你的实际代码吗?
  • 你用什么语言编码?
  • 点不匹配换行符
  • 它不起作用,因为“bought”和“sheep”之间有两个空格。所以I bought sheep 是错误的,I bought sheep 是正确的。
  • (?s:.) - inline modifier group 匹配任何字符,包括换行字符。在你的情况下,它会是这样的:(?s:.*?)。取自answerWiktor Stribiżew

标签: regex


【解决方案1】:

点通常匹配任何字符除了换行符

所以如果.* 不起作用,请设置“点也匹配换行符”选项(或使用(?s).*)。

如果您使用的 JavaScript 没有“dotall”选项,请尝试[\s\S]*。这意味着“匹配任意数量的空白或非空白字符”——实际上是“匹配任意字符串”。

另一个仅适用于 JavaScript 的选项(并且不被任何其他正则表达式识别)是 [^]*,它也匹配任何字符串。但[\s\S]* 似乎使用更广泛,可能是因为它更便携。

【讨论】:

  • .*\n 不匹配,但它会处理一个仅包含 \n 的字符串,因为它匹配 0 个字符。
  • 如果使用 Javascript,在将变量设置为此模式时不要忘记斜杠,例如:var pattern = "[\\s\\S]*";
  • (?s).* 为我工作匹配了所有内容,包括新行
  • 使用 /[\s\S]*/ 存在问题。如果您在代码中使用它,然后注释掉导致语法错误的代码,因为模式的结尾被认为是注释的结尾。然后,您需要从注释掉的代码中删除该模式以使其工作。但是,如果您再次取消注释,它将不再起作用,或者不再像以前那样工作,而且应该。
  • 任何以星号结尾的正则表达式都会出现这种情况。当然,通过在* 之后添加一些内容(如/.*(?:)/)或使用正则表达式构造函数(var foo = new RegExp(".*"))很容易避免。
【解决方案2】:

(.*?) 匹配任何东西 - 我已经使用了很多年了。

【讨论】:

  • 但这是否匹配换行符?
  • 我在 Sublime Text 上使用了它,效果很好。谢谢! ("title":".*?")
  • 在 Javascript 中,使用 [\s\S]*[^]*
  • 我不知道,但每次我使用这个表达方式时,我都感到内疚,因为我没有为我的用例做出具体的表达方式。如果说w+ 还不够,我最终会使用.+。幸好还没回来咬我。
  • 这似乎不包括新行或尾随句号。我发现这种轻微的改变会影响一切(?s)。*
【解决方案3】:

选择并记住以下一项!!! :)

[\s\S]*
[\w\W]*
[\d\D]*

说明:

\s: 空格 \S: 不是空格

\w: 字 \W: 不是字

\d: 数字 \D: 不是数字

(如果您需要 1 个或更多字符 [而不是 0 个或更多],您可以将 * 交换为 +)。




奖励编辑:

如果你想在一行中匹配所有内容,你可以使用这个:

[^\n]+

说明:

^:不是

\n: 换行

+: 1 个字符或更多

【讨论】:

    【解决方案4】:

    试试这个:

    I bought (.* )?sheep
    

    甚至

    I bought .*sheep
    

    【讨论】:

      【解决方案5】:

      /.*/ 如果没有换行符,效果很好。如果它必须匹配换行符,这里有一些解决方案:

      Solution Description
      /.*/s /s (dot all flag) makes . (wildcard character) match anything, including line breaks. Throw in an * (asterisk), and it will match everything. Read more.
      /[\s\S]*/ \s (whitespace metacharacter) will match any whitespace character (space; tab; line break; ...), and \S (opposite of \s) will match anything that is not a whitespace character. * (asterisk) will match all occurrences of the character set (Encapsulated by []). Read more.

      【讨论】:

      • 它不匹配任何字符吗?想要匹配一个或多个。
      • 是的,我在上面发布的解决方案也将匹配空字符串。如果要匹配至少一个字符,只需将* 替换为+
      • /[\s\S]*/ 对我有用,可以匹配任何东西,忽略断线
      【解决方案6】:

      因为. 查找单个字符,换行符或行终止符除外。

      所以,要匹配任何东西,你可以这样使用:(.|\n)*?

      希望对你有帮助!

      【讨论】:

      • 也许我有点无知,但据我所知,? 使前面的量词变得懒惰,导致它匹配尽可能少的字符(在这种情况下,为零!)
      • 另外,这仅适用于 LF (\n) 行尾,但不适用于 CR (\r) 或 CRLF (\r\n) 行尾。
      【解决方案7】:

      使用.*,并确保您使用的是相当于单行的实现,以便匹配行结尾

      这里有很好的解释-> http://www.regular-expressions.info/dot.html

      【讨论】:

        【解决方案8】:

        如果您使用 JavaScript,ES2018 添加了 /s (dotAll) 标志。使用/s 标志,点. 将匹配任何字符,包括换行符。

        console.log("line_1\nline_2".match(/.+/s))

        注意:目前并非所有浏览器都支持。

        【讨论】:

          【解决方案9】:

          (.*?) 对我不起作用。我正在尝试匹配 /* */ 包围的 cmets,它可能包含多行。

          试试这个:

          ([a]|[^a])
          

          此正则表达式匹配 aanything else expect a。当然,这意味着匹配所有内容。

          顺便说一句,在我的情况下,/\*([a]|[^a])*/ 匹配 C 风格的 cmets。

          感谢@mpen 提供更简洁的方法。

          [\s\S]
          

          【讨论】:

          • 在 JS 中最常用的方法是[\s\S] -- 即匹配空格和非空格。
          【解决方案10】:

          对于 JavaScript,最好和最简单的答案似乎是 /.\*/

          正如其他人建议的那样,/(.*?)/ 也可以,但/.\*/ 更简单。模式内的() 是不需要的,据我所见,结尾? 也不需要完全匹配任何东西(包括空字符串)


          非解决方案:

          • /[\s\S]/ 不匹配空字符串,因此不是解决方案。

          • /[\s\S]\*/ 也匹配空字符串。但它有一个问题:如果你在代码中使用它,那么你不能注释掉这样的代码,因为*/ 被解释为注释结束。

          /([\s\S]\*)/ 有效且没有评论问题。但它比/.*/ 更长更复杂。

          【讨论】:

          • 顺便说一句。似乎上面的代码摘录使 Stack Overflow 以斜体显示我的部分答案,这不是我的意图。
          【解决方案11】:

          2018 规范提供了s flag(别名:dotAll),这样. 将匹配任何字符,包括换行符:

          const regExAll = /.*/s; //notice the 's'
          
          let str = `
          Everything
              in  this
                      string
                              will
                                  be
              matched. Including whitespace (even Linebreaks).
          `;
          
          console.log(`Match:`, regExAll.test(str)); //true
          console.log(`Index Location:`, str.search(regExAll));
          
          let newStr = str.replace(regExAll,"?");
          console.log(`Replaced with:`,newStr); //Index: 0

          【讨论】:

            【解决方案12】:
            1. 正则表达式:

              /I bought.*sheep./
              

              匹配 - 整个字符串直到行尾

              I bought sheep. I bought a sheep. I bought five sheep.

            2. 正则表达式:

              /I bought(.*)sheep./
              

              匹配 - 整个字符串,并捕获 () 中的 子字符串 以供进一步使用

              I bought sheep. I bought a sheep. I bought five sheep.

              我买了sheep. I bought a sheep. I bought fivesheep。

              使用 Javascript/Regex

              的示例
              'I bought sheep. I bought a sheep. I bought five sheep.'.match(/I bought(.*)sheep./)[0];
              

              输出:

              “我买了羊。我买了一只羊。我买了五只羊。”

              'I bought sheep. I bought a sheep. I bought five sheep.'.match(/I bought(.*)sheep./)[1];
              

              输出:

              “羊。我买了一只羊。我买了五只”

            【讨论】:

              【解决方案13】:
              <?php
              $str = "I bought _ sheep";
              preg_match("/I bought (.*?) sheep", $str, $match);
              print_r($match);
              ?>
              

              http://sandbox.phpcode.eu/g/b2243.php

              【讨论】:

                【解决方案14】:

                我推荐使用/(?=.*...)/g

                示例

                const text1 = 'I am using regex';
                /(?=.*regex)/g.test(text1) // true
                
                const text2 = 'regex is awesome';
                /(?=.*regex)/g.test(text2) // true
                
                const text3 = 'regex is util';
                /(?=.*util)(?=.*regex)/g.test(text3) // true
                
                const text4 = 'util is necessary';
                /(?=.*util)(?=.*regex)/g.test(text4) // false because need regex in text
                

                使用regex101 进行测试

                【讨论】:

                  【解决方案15】:

                  老实说,很多答案都是旧的,所以我发现如果你只是简单地测试任何字符串,而不管使用“/.*/i”的字符内容如何,​​都足以得到一切。

                  【讨论】:

                  • /.*/i 将不匹配换行符。此外,/i(“忽略大小写”标志)是多余的。 ?
                  【解决方案16】:

                  我用这个:(.|\n)+ 对我来说就像一个魅力!

                  【讨论】:

                  • 从不使用此模式(除非您必须使用 ElasticSearch 正则表达式)。它会导致大量的回溯步骤,并导致堆栈溢出问题。另外,earlier提到了这个解决方案。
                  猜你喜欢
                  • 1970-01-01
                  • 2012-11-12
                  • 1970-01-01
                  • 1970-01-01
                  • 2012-01-24
                  • 1970-01-01
                  • 2016-03-04
                  • 2011-10-28
                  相关资源
                  最近更新 更多