我有一个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
答案 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;
请注意此解决方案的假设: - 你想要的是第二个捕获组的第一个替代品。 - 没有嵌套的捕获组 - 没有转义捕获组分隔符
对于任何更复杂的事情(实际上,对于这个用例),您可能希望考虑从任何来源确定获取冻结替换,而不是从正则表达式模式中提取它。否则将会有人为你提供代码维护的噩梦。