如何从plsql中的字符串中提取几个指定字母数字整个单词之前的文本
How to extract text before several specified alphanumeric whole words from string in plsql
如何从字符串中删除特定字母数字值之后的所有字符
例如,如果我们在第一个之后删除字符串,则“covid19 1st case”应该是“covid19”;
在“covid19 2d case”的情况下,如果我们在 2d 之后删除字符串,它应该是“covid19”
我正在尝试以下查询
select regexp_substr('covid19 1st case','[^1st]*') from dual;
但它给 covid 作为输出任何线索。
如果我们有预定义的字母数字值,我们可以在单个表达式中完成吗
就像我们可以删除 1st 和 2d 之后的所有字符串。
谢谢
你可以使用
select regexp_substr('covid19 1st case','^(.*?)\s+(1st|2d)($|\W)', 1, 1, NULL, 1) from dual;
select regexp_substr('covid19 1st case','^(.*?)\s*(^|\W)(1st|2d)($|\W)', 1, 1, NULL, 1) from dual;
参见regex demo #1 and regex demo #2。
(^|\W)
和 ($|\W)
用于代替 Oracle SQL 正则表达式引擎不支持的词边界。
详情:
^
- 字符串开头
(.*?)
- 第 1 组:除换行字符外的任何零个或多个字符尽可能少
\s*
- 零个或多个空格(\s+
匹配一个或多个)
(^|\W)
- 第 2 组:字符串开头或非单词字符
(1st|2d)
- 第 3 组:1st
或 2d
($|\W)
- 第 4 组:字符串结尾或非单词字符。
另一种变体是使用 REGEXP_REPLACE
(您只需要匹配字符串的其余部分):
select regexp_replace('covid19 1st case','^(.*?)\s*(\W|^)(1st|2d)(\W|$).*', '') from dual;
参见this regex demo,
指第1组值。
如何从字符串中删除特定字母数字值之后的所有字符 例如,如果我们在第一个之后删除字符串,则“covid19 1st case”应该是“covid19”; 在“covid19 2d case”的情况下,如果我们在 2d 之后删除字符串,它应该是“covid19” 我正在尝试以下查询
select regexp_substr('covid19 1st case','[^1st]*') from dual;
但它给 covid 作为输出任何线索。 如果我们有预定义的字母数字值,我们可以在单个表达式中完成吗 就像我们可以删除 1st 和 2d 之后的所有字符串。
谢谢
你可以使用
select regexp_substr('covid19 1st case','^(.*?)\s+(1st|2d)($|\W)', 1, 1, NULL, 1) from dual;
select regexp_substr('covid19 1st case','^(.*?)\s*(^|\W)(1st|2d)($|\W)', 1, 1, NULL, 1) from dual;
参见regex demo #1 and regex demo #2。
(^|\W)
和 ($|\W)
用于代替 Oracle SQL 正则表达式引擎不支持的词边界。
详情:
^
- 字符串开头(.*?)
- 第 1 组:除换行字符外的任何零个或多个字符尽可能少\s*
- 零个或多个空格(\s+
匹配一个或多个)(^|\W)
- 第 2 组:字符串开头或非单词字符(1st|2d)
- 第 3 组:1st
或2d
($|\W)
- 第 4 组:字符串结尾或非单词字符。
另一种变体是使用 REGEXP_REPLACE
(您只需要匹配字符串的其余部分):
select regexp_replace('covid19 1st case','^(.*?)\s*(\W|^)(1st|2d)(\W|$).*', '') from dual;
参见this regex demo,指第1组值。