regexp_replace oracle的替换部分

时间:2013-04-03 22:44:01

标签: sql database oracle plsql

我有一个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

1 个答案:

答案 0 :(得分: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;

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

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