正则表达式 - 匹配任何内容

453

如何创建一个能够匹配任意内容(包括空格)的表达式?
例子:

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

匹配结果: 我买了羊。我买了一只羊。我买了五只羊。

我尝试使用 (.*),但是好像不起作用。


51
.* 应该可以工作。你能复制粘贴你实际的代码吗? - Jacob Eggers
4
你用的是什么编程语言? - Ziggy
16
一个点号不能匹配换行符。 - fy_iceworld
4
无法正常工作的原因是在"bought"和"sheep"之间有两个空格。所以"I bought sheep"是错误的,而"I bought sheep"是正确的。 - user11955706
1
(?s:.) - 内联修饰符组 匹配包括换行符在内的任何字符。在您的情况下,它应该是这样的:(?s:.*?)。摘自 Wiktor Stribiżew答案 - Dmitriy Zub
18个回答

443

通常点号匹配除了换行以外的任何字符。

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

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

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


14
.* 不匹配换行符\n,但会匹配仅包含\n的字符串,因为它匹配0个字符。 - Toto
1
如果使用JavaScript设置变量为此模式,请不要忘记在斜杠上加反斜杠,例如:var pattern = "[\s\S]*"; - Astra Bear
2
(?s).* 对我来说有效,匹配包括换行符在内的所有内容。 - Gujarat Santana
1
在使用 /[\s\S]*/ 时存在问题。如果您在代码中使用它,然后注释掉这样的代码,那么会导致语法错误,因为模式的结尾被认为是注释的结尾。然后,您需要从注释掉的代码中删除该模式以使其正常工作。但是,如果您再次取消注释,它将不再起作用,或者不像以前那样起作用,并且应该起作用。 - Panu Logic
我基本上从不想匹配0个字符,所以我只是使用 [\s\S]+。 - Asa Stallard
显示剩余4条评论

249

(.*?) 可以匹配任何内容 - 我已经使用它好几年了。


85
但这是否匹配换行符? - ineedahero
我在Sublime Text上使用它,它完美地工作了。谢谢! (“title”:“.*?”) - SCabralO
13
在JavaScript中,使用 [\s\S]*[^]* - Jeff Huijsmans
我不知道,但每次使用这个表达式时,我都会感到内疚,因为没有为我的用例制定特定的表达式。如果说,w+不够用,我最终会使用.+。幸运的是,它还没有对我造成影响。 - Tushar
2
这似乎不包括换行符或结尾的句号。我发现这个轻微的修改可以匹配所有内容。(?s).* - Mitchb
显示剩余3条评论

130

请选择并记住以下1个选项!!! :)

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

说明:

\s:空白字符,\S:非空白字符

\w:单词字符,\W:非单词字符

\d:数字字符,\D:非数字字符

(如果您想匹配1个或多个字符[而不是0个或更多字符],可以将*替换为+。)




额外加分内容编辑:

如果您想在一行中匹配所有内容,可以使用以下方法:

[^\n]+
Explanation:
^: 表示“非”
\n: 换行符
+: 匹配一个或多个字符

30

试一下这个:

I bought (.* )?sheep

甚至可以

I bought .*sheep

30

/.*/ 可以很好地匹配没有换行符的情况。如果需要匹配行尾符,可以使用以下解决方案:

解决方案 描述
/.*/s /s (全局匹配标志) 使 . (通配符)匹配任何字符,包括换行符。加入一个 * (星号),将匹配所有内容。阅读更多
/[\s\S]*/ \s(空白元字符)将匹配任何空白字符(空格、制表符、换行符等),\S(与 \s 相反)将匹配任何非空白字符。 *(星号)将匹配字符集中的所有出现(由 [] 包含)。阅读更多

1
它是否匹配零个字符?想要匹配一个或多个。 - mathtick
是的,我上面发布的解决方案也将匹配空字符串。如果您想至少匹配一个字符,只需用“+”替换“*”。 - Sam
1
/[\s\S]*/ 对我来说可以匹配任何内容,忽略换行符。 - Marco Mesen
2
你已经为我节省了将近另外48小时的搜索时间。 - John Max

12

因为.可以匹配除换行符外的任何单个字符。

所以,要匹配任何内容,您可以像这样使用:(.|\n)*?

希望能对您有所帮助!


也许我有点无知,但据我所知,?使前面的量词变成懒惰模式,导致匹配尽可能少的字符(在这种情况下是零!) - Sam
此外,这仅适用于使用 LF (\n) 行尾的情况,而不适用于 CR (\r) 或 CRLF (\r\n) 行尾。 - Sam
不,用Dart不行。 - MwBakker

7

在 Dart 中它不会发生 - MwBakker
1
好观点 @MwBakker。如果你能借给我你的时间机器,我会回到2011年7月11日,告诉自己再等几个月,等待Dart发布。 - Josh

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

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

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


3

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

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


非解决方案:

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

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

/([\s\S]\*)/可以工作,并且没有注释问题。但它比/.*/更长、更复杂。


顺便提一下,似乎上面的代码片段让 Stack Overflow 把我的回答中的某些部分呈现为斜体,这不是我的意图。 - Panu Logic

3
2018年的规范提供了s标志(别名: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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接