ChatGPT解决这个技术问题 Extra ChatGPT

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

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

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

火柴:我买了羊。我买了一只羊。我买了五只羊。

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

.* 应该可以工作。你能粘贴你的实际代码吗?
你用什么语言编码?
点不匹配换行符
它不起作用,因为“买”和“羊”之间有两个空格。所以 I bought sheep 是错误的,而 I bought sheep 是正确的。
(?s:.) - inline modifier group 匹配任何字符,包括换行符。在您的情况下,它将是这样的:(?s:.*?)Wiktor Stribiżew 取自 answer

T
Tim Pietzcker

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

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

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

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


.* 不匹配 \n,但它匹配一个仅包含 \n 的字符串,因为它匹配 0 个字符。
如果使用 Javascript,在将变量设置为此模式时不要忘记斜杠,例如: var pattern = "[\\s\\S]*";
(?s).* 适用于我的所有内容都匹配,包括新行
使用 /[\s\S]*/ 存在问题。如果您在代码中使用它,然后注释掉导致语法错误的代码,因为模式的结尾被认为是注释的结尾。然后,您需要从注释掉的代码中删除该模式以使其工作。但是,如果您再次取消评论,它将不再起作用,或者不再像以前那样工作,而且应该。
任何以星号结尾的正则表达式都是这种情况。当然,通过在 * 之后添加一些内容(如在 /.*(?:)/ 中)或使用正则表达式构造函数(var foo = new RegExp(".*"))很容易避免。
A
Adam Arold

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


但这与换行符匹配吗?
我在 Sublime Text 上使用了它,效果很好。谢谢! ("title":".*?")
在 Javascript 中,使用 [\s\S]*[^]*
我不知道,但每次我使用这个表达式时,我都会感到内疚,因为我没有为我的用例做一个特定的表达式。如果说,w+ 还不够,我最终会使用 .+。幸好还没回来咬我。
这似乎不包括新行或尾随句号。我发现这种轻微的改变会影响一切(?s)。*
T
Tyler

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

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

解释:

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

\w:单词 \W:不是单词

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

(如果您需要 1 个或更多字符 [而不是 0 或更多],您可以将 * 交换为 +)。

奖金编辑:

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

[^\n]+

解释:

^:不是

\n:换行符

+:1 个字符或更多


M
Mike Mozhaev

尝试这个:

I bought (.* )?sheep

甚至

I bought .*sheep

S
Sam

如果没有换行符,/.*/ 效果很好。如果它必须匹配换行符,这里有一些解决方案:

解决方案描述 /.*/s /s(点所有标志)使 . (通配符)匹配任何内容,包括换行符。输入 *(星号),它将匹配所有内容。阅读更多。 /[\s\S]*/ \s(空白元字符)将匹配任何空白字符(空格;制表符;换行符;...),而 \S(与 \s 相对)将匹配任何非空白字符特点。 *(星号)将匹配所有出现的字符集(由 [] 封装)。阅读更多。


它不匹配任何字符吗?想要匹配一个或多个。
是的,我在上面发布的解决方案也将不匹配任何内容/空字符串。如果您想匹配至少一个字符,只需将 * 替换为 +
/[\s\S]*/ 对我有用,可以匹配任何忽略断线的东西
S
Sang Huynh

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

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

希望能帮助到你!


也许我有点无知,但据我所知,? 使前面的量词变得懒惰,导致它匹配尽可能少的字符(在这种情况下,为零!)
此外,这仅适用于 LF (\n) 行尾,而不适用于 CR (\r) 或 CRLF (\r\n) 行尾。
J
Josh

使用 .*,并确保您使用实现的等效单行,以便匹配行结尾

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


S
Sam

如果您使用的是 JavaScript,ES2018 添加了 /s (dotAll) 标志。使用 /s 标志,点 . 将匹配任何字符,包括换行符。

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

注意:并非所有浏览器都支持它。


o
oryxfea

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

尝试这个:

([a]|[^a])

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

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

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

[\s\S]

在 JS 中最常用的方法是 [\s\S] —— 即匹配空格和非空格。
S
Sam

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

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

非解决方案:

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

/[\s\S]\*/ 也匹配空字符串。但它有一个问题:如果你在代码中使用它,那么你不能注释掉这样的代码,因为 */ 被解释为注释结束。

/([\s\S]\*)/ 有效且没有评论问题。但它比/.*/更长更复杂。


顺便提一句。似乎上面的代码摘录使 Stack Overflow 以斜体显示我的部分答案,这不是我的意图。
S
Sam

2018 规范提供了 s flag(别名:dotAll),因此 . 将匹配任何字符,包括换行符:

常量 regExAll = /.*/s; //注意's' let str = ` 这个字符串中的所有内容都将被匹配。包括空格(甚至换行符)。 `; console.log(`匹配:`, regExAll.test(str)); //true console.log(`Index Location:`, str.search(regExAll));让 newStr = str.replace(regExAll,"🐔"); console.log(`替换为:`,newStr); //索引:0


S
SridharKritha

正则表达式:/我买了.*sheep./ 匹配 - 直到行尾的整个字符串我买了羊。我买了一只羊。我买了五只羊。正则表达式:/我买了(。*)羊。/匹配 - 整个字符串,还捕获()中的子字符串以供进一步使用我买了羊。我买了一只羊。我买了五只羊。我买了羊。我买了一只羊。我买了五只羊。使用 Javascript/Regex 的示例 '我买了羊。我买了一只羊。我买了五只羊。'.match(/我买了(.*)sheep./)[0];输出:“我买了羊。我买了一只羊。我买了五只羊。” “我买了羊。我买了一只羊。我买了五只羊。'.match(/我买了(.*)sheep./)[1];输出:“羊。我买了一只羊。我买了五只”


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

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


A
Alex Montoya

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


k
kjohnsonthecoder

老实说,很多答案都是旧的,所以我发现如果你只是简单地测试任何字符串,而不管字符内容如何,“/.*/i”就足以得到一切。


/.*/i 将不匹配换行符。此外,/i(“忽略大小写”标志)是多余的。 😉
M
Montgomery Gole

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


从不 使用此模式(除非您必须使用 ElasticSearch 正则表达式)。它会导致大量的回溯步骤,并导致堆栈溢出问题。此外,earlier提到了这个解决方案。