不是一个完整的新手,但我仍然不了解正则表达式的一切.我试图使用正则表达式删除<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和>可选之间.