如何使表达式绝对匹配任何东西(包括空格)?例:
Regex: 我买了_____只羊 .
Matches: 我买了羊 . 我买了一只羊 . 我买了五只羊 .
我尝试使用 (.*) ,但这似乎不起作用 .
(.*)
更新:我得到它的工作,显然问题不在于正则表达式,只是( . )字符被转义 .
通常,点匹配除换行符之外的任何字符 .
因此,如果 .* 不起作用,请设置"dot matches newlines, too"选项(或使用 (?s).* ) .
.*
(?s).*
如果你"dotall"有"dotall"选项,请尝试 [\s\S]* . 这意味着"match any number of characters that are either whitespace or non-whitespace" - 有效"match any string" .
[\s\S]*
另一个仅适用于JavaScript(并且不被任何其他正则表达式风格识别)的选项是 [^]* ,它也匹配任何字符串 . 但 [\s\S]* 似乎被更广泛地使用,也许是因为它更便携 .
[^]*
(.*?) 匹配任何东西 - 我多年来一直在使用它 .
(.*?)
Choose & memorize 1 of the following!!! :)
[\s\S]* [\w\W]* [\d\D]*
Explanation:
\s :whitespace \S :不是空格
\s
\S
\w :字 \W :不是字
\w
\W
\d :digit \D :不是数字
\d
\D
(如果您想要1个或更多字符[而不是0个或更多],可以将 * 替换为 + ) .
*
+
BONUS EDIT:
如果您想在一行中匹配所有内容,可以使用:
[^\n]+
^ :没有
^
\n :linebreak
\n
+ :1个字符或更多
试试这个:
I bought (.* )?sheep
甚至
I bought .*sheep
使用 .* ,并确保您使用的实现等效于单行,因此您将匹配 line endings .
这里有一个很好的解释 - > http://www.regular-expressions.info/dot.html
<?php $str = "I bought _ sheep"; preg_match("/I bought (.*?) sheep", $str, $match); print_r($match); ?>
http://sandbox.phpcode.eu/g/b2243.php
(.*?) 对我不起作用 . 我正在尝试匹配 /* */ 所包含的注释,这些注释可能包含多行 .
/* */
([a]|[^a])
此正则表达式匹配 a 或 anything else expect a . 绝对地,它意味着匹配一切 .
a
anything else expect a
顺便说一句,在我的情况下, /\*([a]|[^a])*/ 匹配C风格的评论 .
/\*([a]|[^a])*/
感谢@mpen更简洁的方式 .
[\s\S]
对于JavaScript,最好和最简单的答案似乎是/.*/ .
正如其他人所建议的那样/( . ?)/也会起作用,但/./更简单 . 我可以看到模式内的(),也不需要结尾?绝对匹配任何东西(包括空字符串)
NON-解决方案:
/ [\ s \ S] /不匹配空字符串,所以它不是解决方案 .
/ [\ s \ S] * / DOES也匹配空字符串 . 但它有一个问题:如果你在代码中使用它,那么你就不能注释掉这样的代码,因为'* /'被解释为注释结束 .
/([\ s \ S] )/工作,没有评论问题 . 但它比/./更长,更复杂 .
8 回答
通常,点匹配除换行符之外的任何字符 .
因此,如果
.*
不起作用,请设置"dot matches newlines, too"选项(或使用(?s).*
) .如果你"dotall"有"dotall"选项,请尝试
[\s\S]*
. 这意味着"match any number of characters that are either whitespace or non-whitespace" - 有效"match any string" .另一个仅适用于JavaScript(并且不被任何其他正则表达式风格识别)的选项是
[^]*
,它也匹配任何字符串 . 但[\s\S]*
似乎被更广泛地使用,也许是因为它更便携 .(.*?)
匹配任何东西 - 我多年来一直在使用它 .Choose & memorize 1 of the following!!! :)
Explanation:
\s
:whitespace\S
:不是空格\w
:字\W
:不是字\d
:digit\D
:不是数字(如果您想要1个或更多字符[而不是0个或更多],可以将
*
替换为+
) .BONUS EDIT:
如果您想在一行中匹配所有内容,可以使用:
Explanation:
^
:没有\n
:linebreak+
:1个字符或更多试试这个:
甚至
使用
.*
,并确保您使用的实现等效于单行,因此您将匹配 line endings .这里有一个很好的解释 - > http://www.regular-expressions.info/dot.html
http://sandbox.phpcode.eu/g/b2243.php
(.*?)
对我不起作用 . 我正在尝试匹配/* */
所包含的注释,这些注释可能包含多行 .试试这个:
此正则表达式匹配
a
或anything else expect a
. 绝对地,它意味着匹配一切 .顺便说一句,在我的情况下,
/\*([a]|[^a])*/
匹配C风格的评论 .感谢@mpen更简洁的方式 .
对于JavaScript,最好和最简单的答案似乎是/.*/ .
正如其他人所建议的那样/( . ?)/也会起作用,但/./更简单 . 我可以看到模式内的(),也不需要结尾?绝对匹配任何东西(包括空字符串)
NON-解决方案:
/ [\ s \ S] /不匹配空字符串,所以它不是解决方案 .
/ [\ s \ S] * / DOES也匹配空字符串 . 但它有一个问题:如果你在代码中使用它,那么你就不能注释掉这样的代码,因为'* /'被解释为注释结束 .
/([\ s \ S] )/工作,没有评论问题 . 但它比/./更长,更复杂 .