Pau*_*ulb 1 regex postgresql regex-greedy
要更改文本周围的标签对,此Postgres SELECT表达式适用于我:
select regexp_replace('The corpse of the huge <i>fin whale</i> created a spectacle on <span class="day">Friday</span> as <i>people</i> wandered the beach to observe it.',
'(<i>)([^/]+)(</i>)',
'<em>\2</em>',
'g');
Run Code Online (Sandbox Code Playgroud)
我担心参考文献二过分贪婪。我第一次尝试使用参考号2是(。+),但是失败了。([^ /] +)效果更好。但我想知道它是否足够好。
可以做些什么使该SELECT语句更可靠吗?
通常存在两种可能性(PostreSQL的regex引擎似乎都支持这两种可能性)。
使重复内容不愉快:
<i>(.+?)</i>
Run Code Online (Sandbox Code Playgroud)使用否定的前瞻性来确保您消耗了</i>
:
<i>((?:(?!</i>).)+)</i>
Run Code Online (Sandbox Code Playgroud)在这两种情况下,我都删除了不必要的捕获。您\1
现在可以在替换字符串中使用。
两者在工作上应等效。他们的表现可能会有所不同。前者需要回溯,而后者则必须在每个位置尝试超前。哪一个速度更快将不得不分析,甚至可能取决于各个输入字符串。请注意,由于第二种模式使用贪婪重复,因此您可以删除结尾部分</i>
,但仍会得到相同的结果。
从某种意义上讲,您已经拥有了强大的方法,您将永远无法超越</i>
。但是同时,您的方法不允许使用嵌套标签(因为重复不能超过嵌套对的结束标签)。
但是,您应该注意,正则表达式并不是真正可以解析/处理HTML的工作。如果您的标签中有多余的空格怎么办?或者,如果开始标签具有属性,该怎么办?或者,如果一个或两个标签出现在属性名称或注释中怎么办?
归档时间: |
|
查看次数: |
1236 次 |
最近记录: |