正则表达式 - 匹配任何东西

Posted

技术标签:

【中文标题】正则表达式 - 匹配任何东西【英文标题】:Regular Expressions- Match Anything 【发布时间】:2011-10-06 10:04:20 【问题描述】:

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

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

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

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

【问题讨论】:

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

试试这个:

I bought (.* )?sheep

甚至

I bought .*sheep

【讨论】:

【参考方案2】:

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

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

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

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

【讨论】:

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

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

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

【讨论】:

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

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

【讨论】:

【参考方案5】:

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

【讨论】:

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

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

试试这个:

([a]|[^a])

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

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

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

[\s\S]

【讨论】:

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

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

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

说明:

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

\w: 字 \W: 不是字

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

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

奖励编辑:

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

[^\n]+

说明:

^:不是

\n: 换行

+: 1 个字符或更多

【讨论】:

【参考方案8】:

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

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


非解决方案:

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

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

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

【讨论】:

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

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

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

希望对你有帮助!

【讨论】:

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

我推荐使用/(?=.*...)/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 进行测试

【讨论】:

【参考方案11】:

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

【讨论】:

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

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

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

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

【讨论】:

【参考方案13】:

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

【讨论】:

【参考方案14】:

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

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]*/ 对我有用,可以匹配任何东西,忽略断线【参考方案15】:

    正则表达式:

    /I bought.*sheep./
    

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

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

    正则表达式:

    /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];
    

    输出:

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

【讨论】:

【参考方案16】:

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

【讨论】:

从不使用此模式(除非您必须使用 ElasticSearch 正则表达式)。它会导致大量的回溯步骤,并导致堆栈溢出问题。另外,earlier提到了这个解决方案。

以上是关于正则表达式 - 匹配任何东西的主要内容,如果未能解决你的问题,请参考以下文章

以任何顺序匹配正则表达式

正则表达式匹配词

正则表达式匹配

正则表达式匹配

数据处理正则表达式中的括号

在 JUnit 中断言正则表达式匹配