如何使表达式完全匹配任何内容(包括空格)?
示例:
正则表达式:我买了_____只羊。
匹配:我买了羊。我买了一只羊。我买了五只羊。
我尝试使用(.*)
,但这似乎不起作用。
更新:我得到了它的工作,显然问题不在于正则表达式,只是(。)字符被转义。
答案 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)
/.*/
的效果很好。如果必须匹配换行符,请使用以下解决方案:
答案 6 :(得分:2)
正则表达式:
/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 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])
此正则表达式与a
或anything 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);
?>
答案 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)+ 对我来说就像一个魅力!