正则表达式 - 匹配任何东西
Posted
技术标签:
【中文标题】正则表达式 - 匹配任何东西【英文标题】:Regular Expressions- Match Anything 【发布时间】:2011-10-06 10:04:20 【问题描述】:如何使表达式完全匹配任何内容(包括空格)? 示例:
正则表达式:我买了_____羊。
火柴:我买了羊。我买了一只羊。我买了五只羊。
我尝试使用(.*)
,但这似乎不起作用。
【问题讨论】:
.*
应该可以工作。你能粘贴你的实际代码吗?
你用什么语言编码?
点不匹配换行符
它不起作用,因为“bought”和“sheep”之间有两个空格。所以I bought sheep
是错误的,I bought sheep
是正确的。
(?s:.)
- inline modifier group 匹配任何字符,包括换行字符。在你的情况下,它会是这样的:(?s:.*?)
。取自answerWiktor Stribiżew。
【参考方案1】:
试试这个:
I bought (.* )?sheep
甚至
I bought .*sheep
【讨论】:
【参考方案2】:点通常匹配任何字符除了换行符。
所以如果.*
不起作用,请设置“点也匹配换行符”选项(或使用(?s).*
)。
如果您使用的 javascript 没有“dotall”选项,请尝试[\s\S]*
。这意味着“匹配任意数量的空白或非空白字符”——实际上是“匹配任意字符串”。
另一个仅适用于 JavaScript 的选项(并且不被任何其他正则表达式识别)是 [^]*
,它也匹配任何字符串。但[\s\S]*
似乎使用更广泛,可能是因为它更便携。
【讨论】:
.*
与 \n
不匹配,但它会处理一个仅包含 \n
的字符串,因为它匹配 0 个字符。
如果使用 Javascript,在将变量设置为此模式时不要忘记斜杠,例如:var pattern = "[\\s\\S]*";
(?s).*
为我工作匹配了所有内容,包括新行
使用 /[\s\S]*/ 存在问题。如果您在代码中使用它,然后注释掉导致语法错误的代码,因为模式的结尾被认为是注释的结尾。然后,您需要从注释掉的代码中删除该模式以使其工作。但是,如果您再次取消注释,它将不再起作用,或者不再像以前那样工作,而且应该。
任何以星号结尾的正则表达式都会出现这种情况。当然,通过在*
之后添加一些内容(如/.*(?:)/
)或使用正则表达式构造函数(var foo = new RegExp(".*")
)很容易避免。【参考方案3】:
使用.*
,并确保您使用的是相当于单行的实现,以便匹配行结尾。
这里有很好的解释-> http://www.regular-expressions.info/dot.html
【讨论】:
【参考方案4】:<?php
$str = "I bought _ sheep";
preg_match("/I bought (.*?) sheep", $str, $match);
print_r($match);
?>
http://sandbox.phpcode.eu/g/b2243.php
【讨论】:
【参考方案5】:(.*?)
匹配任何东西 - 我已经使用了很多年了。
【讨论】:
但这是否匹配换行符? 我在 Sublime Text 上使用了它,效果很好。谢谢!("title":".*?")
在 Javascript 中,使用 [\s\S]*
或 [^]*
。
我不知道,但每次我使用这个表达方式时,我都感到内疚,因为我没有为我的用例做出具体的表达方式。如果说w+
还不够,我最终会使用.+
。幸好还没回来咬我。
这似乎不包括新行或尾随句号。我发现这种轻微的改变会影响一切(?s)。*【参考方案6】:
(.*?)
对我不起作用。我正在尝试匹配 /* */
包围的 cmets,它可能包含多行。
试试这个:
([a]|[^a])
此正则表达式匹配 a
或 anything else expect a
。当然,这意味着匹配所有内容。
顺便说一句,在我的情况下,/\*([a]|[^a])*/
匹配 C 风格的 cmets。
感谢@mpen 提供更简洁的方法。
[\s\S]
【讨论】:
在 JS 中最常用的方法是[\s\S]
-- 即匹配空格和非空格。【参考方案7】:
选择并记住以下一项!!!! :)
[\s\S]*
[\w\W]*
[\d\D]*
说明:
\s
: 空格 \S
: 不是空格
\w
: 字 \W
: 不是字
\d
: 数字 \D
: 不是数字
(如果您需要 1 个或更多字符 [而不是 0 个或更多],您可以将 *
交换为 +
)。
奖励编辑:
如果你想在一行中匹配所有内容,你可以使用这个:
[^\n]+
说明:
^
:不是
\n
: 换行
+
: 1 个字符或更多
【讨论】:
【参考方案8】:对于 JavaScript,最好和最简单的答案似乎是 /.\*/
。
正如其他人建议的那样,/(.*?)/
也可以,但/.\*/
更简单。模式内的()
是不需要的,据我所见,结尾?
也不需要完全匹配任何东西(包括空字符串)
非解决方案:
/[\s\S]/
不匹配空字符串,因此不是解决方案。
/[\s\S]\*/
也匹配空字符串。但它有一个问题:如果你在代码中使用它,那么你不能注释掉这样的代码,因为*/
被解释为注释结束。
/([\s\S]\*)/
有效且没有评论问题。但它比/.*/
更长更复杂。
【讨论】:
顺便说一句。似乎上面的代码摘录使 Stack Overflow 以斜体显示我的部分答案,这不是我的意图。【参考方案9】:因为.
查找单个字符,换行符或行终止符除外。
所以,要匹配任何东西,你可以这样使用:(.|\n)*?
希望对你有帮助!
【讨论】:
也许我有点无知,但据我所知,?
使前面的量词变得懒惰,导致它匹配尽可能少的字符(在这种情况下,为零!)
另外,这仅适用于 LF (\n
) 行尾,但不适用于 CR (\r
) 或 CRLF (\r\n
) 行尾。【参考方案10】:
我推荐使用/(?=.*...)/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 进行测试
【讨论】:
【参考方案11】:老实说,很多答案都是旧的,所以我发现如果你只是简单地测试任何字符串,而不管使用“/.*/i”的字符内容如何,都足以得到一切。
【讨论】:
/.*/i
将不匹配换行符。此外,/i
(“忽略大小写”标志)是多余的。 ?【参考方案12】:
如果您使用 JavaScript,ES2018 添加了 /s
(dotAll) 标志。使用/s
标志,点.
将匹配任何字符,包括换行符。
console.log("line_1\nline_2".match(/.+/s))
注意:目前并非所有浏览器都支持。
【讨论】:
【参考方案13】: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
【讨论】:
【参考方案14】:/.*/
如果没有换行符,效果很好。如果它必须匹配换行符,这里有一些解决方案:
Solution | Description |
---|---|
/.*/s |
/s (dot all flag) makes . (wildcard character) match anything, including line breaks. Throw in an * (asterisk), and it will match everything. Read more. |
/[\s\S]*/ |
\s (whitespace metacharacter) will match any whitespace character (space; tab; line break; ...), and \S (opposite of \s ) will match anything that is not a whitespace character. * (asterisk) will match all occurrences of the character set (Encapsulated by [] ). Read more. |
【讨论】:
它不匹配任何字符吗?想要匹配一个或多个。 是的,我在上面发布的解决方案也将匹配空字符串。如果要匹配至少一个字符,只需将*
替换为+
。
/[\s\S]*/
对我有用,可以匹配任何东西,忽略断线【参考方案15】:
正则表达式:
/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
sheep。
使用 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];
输出:
“羊。我买了一只羊。我买了五只”
【讨论】:
【参考方案16】:我用这个:(.|\n)+ 对我来说就像一个魅力!
【讨论】:
从不使用此模式(除非您必须使用 ElasticSearch 正则表达式)。它会导致大量的回溯步骤,并导致堆栈溢出问题。另外,earlier提到了这个解决方案。以上是关于正则表达式 - 匹配任何东西的主要内容,如果未能解决你的问题,请参考以下文章