regex - Oracle REGEXP_SUBSTR 前瞻和后瞻
问题描述
我正在尝试编写一个正则表达式,它从给定的文本中获取宽度和长度的最小值和最大值。例如。我有几个示例文本如下。
1. S-BARE-w<=1250;L<=4000
2. S-BARE-w<=1250;4000<L<=6500
3. S-BARE-1250<w<=1550;L<=4000
4. S-BARE-1250< w<=1550;4000<L<=6500
在此我需要获取最小值和最大值。我正在尝试使用REGEXP_SUBSTR
来实现这一点。我正在使用以下带有匹配参数 i 和 x 的正则表达式。我正在使用 4 个正则表达式字符串。\d{4}(?=<W)
找到最小宽度,(?<=W<=)\d{4}
找到最大宽度,\d{4}(?=<L)
找到最小长度和(?<=L<=)\d{4}
找到最大长度。组合正则表达式如下。
\d{4}(?=<W)|(?<=W<=)\d{4}|\d{4}(?=<L)|(?<=L<=)\d{4}
但是上面的正则表达式对所有 4 个参数(即 minm_width、maxm_width、minm_length、maxm_length)都返回 null。
在RegEx Simulator上尝试时,上述这些正则表达式给出了正确的值。但是当我在 oracle 上尝试正则表达式时,REGEXP_SUBSTR
它会返回NULL
。Oracle 语句如下。
WITH TEST_DATA AS
(SELECT 'S-BARE-w<=1250;L<=4000' TXT_REMARKS FROM DUAL
UNION SELECT 'S-BARE-w<=1250;4000<L<=6500' TXT_REMARKS FROM DUAL
UNION SELECT 'S-BARE-1250<w<=1550;L<=4000' TXT_REMARKS FROM DUAL
UNION SELECT 'S-BARE-1250<w<=1550;4000<L<=6500' TXT_REMARKS FROM DUAL)
SELECT TXT_REMARKS,
REGEXP_SUBSTR (TXT_REMARKS, '\d{4}(?=<W)', 1, 1, 'i') WIDTH_MIN,
REGEXP_SUBSTR (TXT_REMARKS, '(?<=W<=)\d{4}', 1, 1, 'i') WIDTH_MAX,
REGEXP_SUBSTR (TXT_REMARKS, '\d{4}(?=<L)', 1, 1, 'i') LENGTH_MIN,
REGEXP_SUBSTR (TXT_REMARKS, '(?<=L<=)\d{4}', 1, 1, 'i') LENGTH_MAX
FROM TEST_DATA;
任何帮助都可以解决这个问题。提前致谢。
解决方案
以下正则表达式应该给出您想要的结果:
WITH TEST_DATA AS
(SELECT 'S-BARE-w<=1250;L<=4000' TXT_REMARKS FROM DUAL
UNION SELECT 'S-BARE-w<=1250;4000<L<=6500' TXT_REMARKS FROM DUAL
UNION SELECT 'S-BARE-1250<w<=1550;L<=4000' TXT_REMARKS FROM DUAL
UNION SELECT 'S-BARE-1250<w<=1550;4000<L<=6500' TXT_REMARKS FROM DUAL)
SELECT TXT_REMARKS,
REGEXP_SUBSTR (TXT_REMARKS, '(\d+)<=?W', 1, 1, 'i',1) WIDTH_MIN,
REGEXP_SUBSTR (TXT_REMARKS, 'W<=?(\d+)', 1, 1, 'i',1) WIDTH_MAX,
REGEXP_SUBSTR (TXT_REMARKS, '(\d+)<=?L', 1, 1, 'i',1) LENGTH_MIN,
REGEXP_SUBSTR (TXT_REMARKS, 'L<=?(\d+)', 1, 1, 'i',1) LENGTH_MAX
FROM TEST_DATA;
您可以只使用括号标记您要获取的部分,然后使用 6. 参数引用它们REGEXP_SUBSTR
。
将所有表达式的等号标记为可选,因为边界可能是严格的,也可能不是严格的。
推荐阅读
- discord.js - 在 guild.roles 中获取未定义
- django - 模板中的 Django _set.all 具有一对多关系
- r - 在 R 中生成具有指定样本大小和概率的随机样本数据
- c++ - 打印 C++ 哈希表的问题
- lua - 有没有一种简单的方法可以将 lua 表转换为 C++ 数组或向量?
- r - 如何创建一个函数来计算每个数据列、每个数据因子的中位数和四分位数?
- javascript - 在绘制新表格页面之前滚动到视图触发器(具有副作用的事件处理程序)
- python - Pycharm 没有显示任何输出
- vb.net - 如何使用“关键字”退出循环
- php - Laravel 通知 - Mailgun - Outlook 中的“代表”