在Regex中,为什么"((.|\s)*?)"与"\ s*.*"不同

inv*_*ear 6 regex

不是一个完整的新手,但我仍然不了解正则表达式的一切.我试图使用正则表达式删除<p>标签和我的第一次尝试

<p\s*.*>
Run Code Online (Sandbox Code Playgroud)

是如此贪婪,它抓住了整条线

<p someAttributes='example'>SomeText</p>
Run Code Online (Sandbox Code Playgroud)

我得到它与合作

((.|\s)*?)
Run Code Online (Sandbox Code Playgroud)

这似乎应该同样贪婪,任何人都可以帮助我理解为什么它不是吗?

试图将这个问题尽可能地作为语言非特定的,但是如果它产生很大的不同,我就是用ColdFusion的reReplaceNoCase做的.

Chr*_*rau 12

关键的区别在于*?部分,它创建了一个不情愿的量词,因此它尝试尽可能少地匹配.标准量词*是一个贪婪的量词,并尽可能地匹配.

参见例如Greedy vs. Reluctant vs. Possessive Quantifiers

正如Seth Robertson所说,你可能想要使用一个不依赖于贪婪/不情愿行为的正则表达式.实际上,您可以编写占有性正则表达式以获得最佳性能:

<p\s*+[^>]*+>
Run Code Online (Sandbox Code Playgroud)

这里\s*+匹配任意数量的空格,同时[^>]*+匹配任意数量的字符>.两个量词都不会在不匹配的情况下追溯,这会在不匹配的情况下改善运行时,并且对于一些正则表达式实现也在匹配的情况下(因为可以省略内部回溯数据).

请注意,如果有其他标签开头<p(长时间没有直接写HTML),那么您也匹配这些标签.如果你不想这样,请使用这样的正则表达式:

<p(\s++[^>]*+)?>
Run Code Online (Sandbox Code Playgroud)

这使整个部分介于<p>可选之间.