我有以下正则表达式问题。
输入:
123_321_009
3111_00_001
5123_123
555
666_A66
777_B77_777
输出请求如下:
123_321
3111_00
5123
555
666_A66
777_B77
有没有办法获得上面输出的值?
我尝试了下面的陈述,但缺乏如何获得我需要的价值的想法。
^(.*?)\\s?([_0-9])?$
不需要在最后一个下划线后出现的值。
答案 0 :(得分:2)
您可以使用REGEXP_REPLACE删除/包括最后一个下划线的数字。
<强>查询强>:
with x(y) as (
select '123_321_009' from dual union all
select '3111_00_001' from dual union all
select '5123_123' from dual union all
select '666_A66' from dual union all
select '777_B77_777' from dual union all
select '555' from dual
)
select y, regexp_replace(y,'_\d+$') substr
from x
<强> Results 强>:
| Y | SUBSTR |
|-------------|---------|
| 123_321_009 | 123_321 |
| 3111_00_001 | 3111_00 |
| 5123_123 | 5123 |
| 666_A66 | 666_A66 |
| 777_B77_777 | 777_B77 |
| 555 | 555 |
模式:
_ --matches an underscore
\d+ --matches one or more numbers
$ --matches end of the string
实际上,这会匹配/包括最后一个下划线的所有数字。第三个参数是regexp_replace被省略。所以,模式是 删除并替换为空。
答案 1 :(得分:1)
由于您使用的是Oracle,因此可以使用具有此模式的regex_replace(val,pattern,'')
函数。
以下模式将满足您提供的样本:
_[0-9]{3}$
_[0-9]*$
以下是使用SQL * Plus的这种方法的演示:
SCOTT@dev> WITH tab(num_val) AS
2 ( SELECT '123_321_009' FROM dual
3 UNION ALL
4 SELECT '3111_00_001' FROM dual
5 UNION ALL
6 SELECT '5123_123' FROM dual
7 UNION ALL
8 SELECT '555' FROM dual
9 )
10 SELECT tab.num_val,
11 regexp_replace(tab.num_val,'_[0-9]{3}$') approach_1,
12 regexp_replace(tab.num_val,'_[0-9]*$') approach_2
13 FROM tab
14 /
NUM_VAL APPROACH_1 APPROACH_2
=========== ====================== ==================
123_321_009 123_321 123_321
3111_00_001 3111_00 3111_00
5123_123 5123 5123
555 555 555
如果您提供了更大的抽样(或更具体的规则),则可以提供更具体的解决方案。