regex - 如何从plsql中的字符串中提取几个指定的字母数字整个单词之前的文本
问题描述
如何从字符串中删除特定字母数字值之后的所有字符,例如“covid19 1st case”如果我们在第一个之后删除字符串,则应该是“covid19”;在“covid19 2d case”的情况下,如果我们在 2d 之后删除字符串,它应该是“covid19”我正在尝试下面的查询
select regexp_substr('covid19 1st case','[^1st]*') from dual;
但它给covid作为输出任何线索。如果我们有预定义的字母数字值,我们可以在单个表达式中做到这一点,就像我们可以删除第 1 次和第 2 次之后的所有字符串一样。
谢谢
解决方案
您可以使用
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;
请参阅正则表达式演示 #1和正则表达式演示 #2。
和用于代替 Oracle SQL 正(^|\W)
则($|\W)
表达式引擎不支持的字边界。
详情:
^
- 字符串的开始(.*?)
- 第 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|$).*', '\1') from dual;
请参阅此正则表达式演示,\1
指的是 Group 1 值。
推荐阅读
- r - 显示 R 中图例的选择级别
- c# - 如何简化这个“清除”命令?
- javascript - 悬停在线图Chart.js后旧数据闪烁
- postgresql - 如何在 Postgresql 中删除空值并使其变为 10 行?
- git - 如何将子模块添加到我现有的 repo,在本地进行更改,并将所有更改推送到我的 github?
- vue.js - 无法从 Vuex [Quasar] 访问商店
- android - Wear 操作系统上的自定义扩展通知实现
- linux - 我无法在 Ubuntu 上安装 xde expo
- ruby-on-rails - 在资产预编译期间访问数据库/模型对象
- excel - 创建新工作簿,然后将该 WB 名称用作变量