如何从plsql中的字符串中的几个指定的字母数字全字之前提取文本

问题描述

如何从字符串中删除特定字母数字值后的所有字符 例如,如果我们在 1st 之后删除字符串,“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,NULL,1) from dual;
select regexp_substr('covid19 1st case','^(.*?)\s*(^|\W)(1st|2d)($|\W)',1) from dual;

参见 regex demo #1regex demo #2

(^|\W)($|\W) 用于替代 Oracle SQL 正则表达式引擎不支持的字边界。

详情

  • ^ - 字符串的开始
  • (.*?) - 第 1 组:除换行符以外的任何零个或多个字符
  • \s* - 零个或多个空格(\s+ 匹配一个或多个)
  • (^|\W) - 第 2 组:字符串开头或非单词字符
  • (1st|2d) - 第 3 组:1st2d
  • ($|\W) - 第 4 组:字符串结尾或非单词字符。

另一种变体是使用 REGEXP_REPLACE(您只需要匹配字符串的其余部分):

select regexp_replace('covid19 1st case','^(.*?)\s*(\W|^)(1st|2d)(\W|$).*','\1') from dual;

参见 this regex demo\1 指的是 Group 1 值。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...