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


278

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

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

匹配:我买了羊。我买了只羊。我买了五只羊。

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

更新:我让它起作用了,显然问题不在于正则表达式,只是(。)字符被转义了。


27
.*应该管用。您可以粘贴您的实际代码吗?
Jacob Eggers

2
您用什么语言编码?
Ziggy

9
点将不匹配换行符
zee 2013年

Answers:


293

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

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

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

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


7
.*不匹配,\n但会匹配仅包含\n匹配0字符的字符串。
Toto

1
如果使用Javascript,在将变量设置为此模式时不要忘记使用斜杠,例如:var pattern =“ [\\ s \\ S] *”;
阿斯特拉熊

(?s).*对我来说,作品与一切都匹配,包括换新线
古吉拉特邦桑塔纳

1
使用/ [\ s \ S] * /有一个问题。如果在代码中使用它,然后注释掉会导致语法错误的代码,因为模式的结尾被认为是注释的结尾。然后,您需要从注释掉的代码中删除该模式以使其起作用。但是,如果您再次取消注释,它将不再起作用,或者不再像以前那样应该工作。
Panu Logic

任何以星号结尾的正则表达式都是这种情况。当然,可以很容易地避免,可以在后面添加一些内容*(如/.*(?:)/),也可以使用regex构造函数(var foo = new RegExp(".*"))。
蒂姆·皮茨克

177

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


61
但这与换行符匹配吗?
ineedahero '16

我在Sublime Text上使用了它,效果很好。谢谢!("title":".*?")
SCabralO

8
在Javascript中,使用[\s\S]*[^]*
Jeff Huijsmans

我不知道,但是每次我使用此表达式时,我都会为自己的用例不做特定的表达而感到内。如果说w+还不够,我最终会使用.+。幸运的是还没有回来咬我。
塔沙尔

使用Python为我工作
大约

89

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

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

说明:

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

\w:字\W:不字

\d:数字\D:非数字

(如果需要1个或更多字符(而不是0个或更多)*+则可以交换。)




奖金编辑:

如果要在一行上匹配所有内容,可以使用以下命令:

[^\n]+

说明:

^:不

\n: 越线

+:1个字符以上




4

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

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

希望能帮助到你!


2

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

试试这个:

([a]|[^a])

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

在我的情况下,BTW /\*([a]|[^a])*/与C样式注释匹配。

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

[\s\S]

1
在JS中执行此操作的最常见方法是[\s\S]-匹配空格和非空格。
mpen 2015年

2

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

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

非解决方案:

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

/ [\ s \ S] * /也匹配空字符串。但这有一个问题:如果在代码中使用它,则无法注释掉此类代码,因为'* /'被解释为注释结束。

/([\ s \ S] *)/有效,并且没有注释问题。但是比/.*/更长,更复杂。


顺便说一句。似乎上面的代码摘录使Stack Overflow用斜体字表示了部分答案,这不是我的意图。
Panu Logic

1

如果您使用JavaScript,则ES2018添加了s(dotAll)标志。带有s标志的点将.匹配包括换行符在内的所有字符。

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

注意:某些浏览器尚不支持。


1

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

上面的代码可在Chrome中运行,但该s标记尚未在Firefox中实现,但很快就会实现



0

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


0

老实说,很多答案都是旧的,所以我发现,如果您只测试任何字符串,无论字符内容如何,​​都使用“ /.*/i”就可以了。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.