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

时间:2011-07-15 19:04:53

标签: regex

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

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

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

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

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

16 个答案:

答案 0 :(得分:235)

通常,点匹配任何字符(换行符除外)。

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

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

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

答案 1 :(得分:137)

(.*?)匹配任何东西 - 我多年来一直在使用它。

答案 2 :(得分:78)

选择&记住以下1项!!! :)

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

<强>解释

\s:空白\S:不是空白

\w:字\W:不是字

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

(如果您想要1个或更多字符[而不是0个或更多],则可以*兑换+




奖金编辑:

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

[^\n]+

<强>解释

^:不是

\n:换行

+:1个字符或更多

答案 3 :(得分:15)

试试这个:

I bought (.* )?sheep

甚至

I bought .*sheep

答案 4 :(得分:6)

使用.*,并确保您使用的是与单线相同的实现,因此您将匹配行结尾

这里有一个很好的解释 - &gt; http://www.regular-expressions.info/dot.html

答案 5 :(得分:2)

如果没有换行符,

/.*/的效果很好。如果必须匹配换行符,请使用以下解决方案:

<身体>
解决方案 说明
/.*/s /s(点所有标记)可使.(通配符)匹配任何内容,包括换行符。放入*(星号),它将匹配所有内容。 Read more
/[\s\S]*/ \s(空格元字符)将匹配任何空格字符(空格;制表符;换行符; ...)和\S(与{ {1}})将匹配空白字符。 \s(星号)将匹配所有出现的字符集(由*封装)。 Read more

答案 6 :(得分:2)

  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 five绵羊。

    使用 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];
    

    输出:

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

答案 7 :(得分:1)

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

试试这个:

([a]|[^a])

此正则表达式与aanything else expect a匹配。绝对地,它意味着匹配所有东西。

BTW,在我的情况下,/\*([a]|[^a])*/匹配C风格的评论。

感谢@mpen更简洁的方式。

[\s\S]

答案 8 :(得分:1)

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

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

非解决方案:

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

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

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

答案 9 :(得分:1)

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

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

希望有帮助!

答案 10 :(得分:0)

<?php
$str = "I bought _ sheep";
preg_match("/I bought (.*?) sheep", $str, $match);
print_r($match);
?>

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

答案 11 :(得分: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 进行测试

答案 12 :(得分:0)

老实说,很多答案都是旧的,所以我发现,如果仅使用“ /.*/i”来测试任何字符串而不论字符内容如何,​​都将获得一切。

答案 13 :(得分:0)

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

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

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

答案 14 :(得分:0)

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

以上代码可在Chrome中运行,但是s标志尚未在Firefox中实现,但它将为soon

答案 15 :(得分:0)

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