正责表达式量词符号的逃逸

今天有开发人员问我,需要取出下面字符串 + 号之前的字符串。
原字符串:”[爱情狂人]性感大片+w(160)h(128)”
目标取出:“[爱情狂人]性感大片” ,即 + 号之前的字符串。

当然最先想到的是可以先找出 + 号的位置,然后通过 substring 函数来取,但这方法不太灵活,于是想到使用正责表达式,应该可以实现。

创建测试表

1
2
3
4
5
6
7
8
9
10
11
12
13
skytf=> create table test_44 (id integer, name varchar(64));  
CREATE TABLE
skytf=> insert into test_44 values (1,'[爱情狂人]性感大片+w(160)h(128)');
INSERT 0 1
skytf=> insert into test_44 values (2,'[爱情狂人]性感大片?w(160)h(128)');
INSERT 0 1

skytf=> select * from test_44;
id | name
----+---------------------------------
1 | [爱情狂人]性感大片+w(160)h(128)
2 | [爱情狂人]性感大片?w(160)h(128)
(2 rows)

使用正责表达式检索

尝试使用正责表达式检索,如下:

1
2
3
4
5
skytf=> select substring(name from '(.*)+') from test_44 where id=1;  
substring
-----------

(1 row)

备注:由于 + 号是量词符合,检索不出,需要加上逃逸字符。

使用逃逸字符检索

1
2
3
4
5
6
7
8
9
10
11
skytf=> select substring(name from E'(.*)+') from test_44 where id=1;  
substring
--------------------
[爱情狂人]性感大片
(1 row)

skytf=> select substring(name from E'(.*)?') from test_44 where id=2;
substring
--------------------
[爱情狂人]性感大片
(1 row)

备注:使用逃逸字符号,检索成功。

使用 Position 函数检索

1
2
3
4
5
skytf=> select substring(name from 1 for position ('+' in name ) -1 ) from test_44 where id=1;  
substring
--------------------
[爱情狂人]性感大片
(1 row)

备注:些方法先通过 position 函数找出 + 号的位置,然后再通过 substring 取出,这种方法用得比较多,特别是在 Oracle 环境下。

总结

关于正责表达式的逃逸还有很多情况,也很复杂,这里不一一举例,有兴趣的朋友可以自己实验下。

原创文章,作者:1402239773,如若转载,请注明出处:https://blog.ytso.com/236416.html

(0)
上一篇 2022年1月24日
下一篇 2022年1月24日

相关推荐

发表回复

登录后才能评论