1

我有一个 regexp_replace 我想让替换部分成为被替换字符串的子部分。在下面的示例中 /2 应该始终给出第一部分,即 MON 例如

SELECT REGEXP_REPLACE('Test MON 234','^(.*? )(MON|FRI|SAT|SUN).*$', '\1\2') FROM dual;
==> Test MON
SELECT REGEXP_REPLACE('QA FRI 111','^(.*? )(MON|FRI|SAT|SUN).*$', '\1\2') FROM dual;
should give ==>  QA MON
4

1 回答 1

4

琐碎的答案:

SELECT REGEXP_REPLACE('Test MON 234','^(.*? )(MON|FRI|SAT|SUN).*$', '\1MON') FROM dual;
SELECT REGEXP_REPLACE('QA FRI 111','^(.*? )(MON|FRI|SAT|SUN).*$', '\1MON') FROM dual;

不那么简单的答案:从正则表达式中提取替换字符串的冻结部分。

SELECT REGEXP_REPLACE('^(.*? )(MON|FRI|SAT|SUN).*$', '^[^(]*\([^(]*\(([^)|]+).*$', '\1') FROM dual;

请注意此解决方案的假设: - 您需要第二个捕获组的第一个替代方案。- 没有嵌套的捕获组 - 没有转义的捕获组分隔符

对于任何更复杂的事情(实际上,对于这个用例也是如此),您可能希望考虑从确定的任何来源获取冻结的替换,而不是通过从正则表达式模式中提取它。否则会有人面临代码维护的噩梦。

于 2013-04-04T12:24:13.907 回答