首页 > 解决方案 > 发生第 n 次后正则表达式 Oracle 替换

问题描述

我试图在第 n 次发生之前进行匹配,以及它是如何工作的 https://regex101.com/r/wJ9yS6/192

我试图在 oracle regex replace 上应用正则表达式

WITH t AS 
(SELECT 'Home|-|Antennas|¿|Directional Antennas|¿|Gain Horn Antennas|¿|Standard Gain Horn Antennas 
 With Coax Input|¿|10 GHz to 15 GHz WR75 Standard Gain Horn Antennas|¿ WR-75 Waveguide Standard Gain 
Horn Antenna Operating From 10 GHz to 15 GHz With a Nominal 15 dB Gain N Female Input'
mycol
FROM dual)
SELECT
     REGEXP_REPLACE (mycol, '(^(?:[^|]*\|){7})(.*)', '\1')
 FROM t; 

但这是我得到的完整字符串我不知道为什么

标签: regex

解决方案


请注意,Oracle 正则表达式不支持非捕获组。您需要改用捕获组。

你可以使用^(([^|]*\|){7}).*正则表达式(这里不需要最后一组,(.*)可以写成.*):

WITH t AS 
(SELECT 'Home|-|Antennas|¿|Directional Antennas|¿|Gain Horn Antennas|¿|Standard Gain Horn Antennas With Coax Input|¿|10 GHz to 15 GHz WR75 Standard Gain Horn Antennas|¿ WR-75 Waveguide Standard Gain Horn Antenna Operating From 10 GHz to 15 GHz With a Nominal 15 dB Gain N Female Input'
mycol
FROM dual)
SELECT
     REGEXP_REPLACE (mycol, '^(([^|]*\|){7}).*', '\1')
 FROM t 

输出(见在线演示):

在此处输入图像描述

请注意,您在正则表达式测试器中使用了没有换行符的字符串,并且问题中的字符串包含换行符。您可能想要.匹配任何字符,您需要n作为第 6 个参数传递:

REGEXP_REPLACE (mycol, '^(([^|]*\|){7}).*', '\1', 1, 0, 'n')

会计。对于文档n允许句点字符 ( .) 匹配换行符。默认情况下,句点是通配符。 ”。1将从字符串开始位置开始匹配,并0启用替换所有匹配项(虽然这里我们只需要一个,你也可以1在这里使用,但在这里没关系)。

查看另一个 Oracle 演示


推荐阅读