【问题标题】:Oracle POSIX dosent match Regular ExpressionOracle POSIX 与正则表达式不匹配
【发布时间】:2020-06-14 12:23:59
【问题描述】:

我正在尝试用正则表达式替换换行符。我有两个数据库 Oralce 和 MySQL。 SQL 语句在 MySQL 上运行良好,但在 Oralce 上不行。

这是我的示例文本:

<ul>
<li>Was soll erreicht worden sein, wenn man das Projekt durchgeführt hat?</li>
</ul>
Formulieren Sie immer konkret.
<ul>
<li><strong><span style=\"color: #800000;\">Wirtschaftliche Ziele</span></strong> (z. B.: Umsatzsteigerung im betroffenen Produktbereich: 20% im 3. Quartal des ersten Geschäftsjahres)</li>
</ul>
<ul>
<li>Test</li>
</ul>

目标是在每个&lt;/li&gt;&lt;/ul&gt; 之后放置一个&lt;/ul&gt;&lt;br/&gt;,其中后面的字符是换行符,而不是我的字符&lt;

在 MySQL 中的工作解决方案:

SELECT *,
REGEXP_REPLACE(DeInfo, '(<\/ul>)(\r?\n)(?=[^<])', '</ul><br/>') as newDeInfo,
DeInfo
FROM txttrans 

Oralce 语句无效:

SELECT id, deinfo, FIRMID,
REGEXP_REPLACE(DeInfo, '(<\/ul>)(\r ? \n)(?=[^<])', '</ul><br/>', 1, 0, 'i') as TEST
FROM txttrans

【问题讨论】:

标签: sql regex oracle posix regexp-replace


【解决方案1】:

由于 Oracle 不支持前瞻,您可以尝试使用普通捕获组并在替换中使用它。

SELECT id, deinfo, FIRMID,
REGEXP_REPLACE(DeInfo, '(<\/ul>)(\r ? \n)([^<])', '</ul><br/>\3', 1, 0, 'i') as TEST
FROM txttrans

【讨论】:

  • 为什么要在替换参数中添加3$
  • 这是一个错字,您需要使用 \3,而不是 $3。这个想法如下:您不能使用前瞻,因此您必须实际捕获下一个符号,然后在替换字符串中使用它。例如,在字符串&lt;/ul&gt;\nSome text 中,第一个匹配组将捕获&lt;/ul&gt;,第二个将捕获新行\n,第三个组将捕获一个字母S。所以我们用&lt;/ul&gt;&lt;br/&gt;S替换整个匹配&lt;/ul&gt;\nS,得到&lt;/ul&gt;&lt;br/&gt;Some text
  • 有道理。我也尝试适应你的想法,但它总是添加&lt;/ul&gt;&lt;br/&gt;\3。这是我的解决方案:SELECT id, deinfo, FIRMID, REGEXP_REPLACE(DeInfo, '&lt;/ul&gt;[[:space:]][^&lt;][^&lt;br /&gt;]{0}', '&lt;/ul&gt;&lt;br/&gt;\3', 1, 0, 'i') as TEST FROM txttrans;
【解决方案2】:

感谢@Alex,

可行的解决方案:

SELECT id, deinfo, FIRMID,
REGEXP_REPLACE(DeInfo, '(</ul>)([[:space:]][^<])([^<br />]{0})', '</ul><br/>\2', 1, 0, 'i') as TEST
FROM txttrans;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-08
    • 1970-01-01
    • 2017-04-05
    • 2015-01-07
    相关资源
    最近更新 更多