mysql中的子字符串正则表达式匹配

     2023-03-28     129

关键词:

【中文标题】mysql中的子字符串正则表达式匹配【英文标题】:Substring regex matching in mysql 【发布时间】:2021-03-02 14:04:42 【问题描述】:

我有一个复杂的问题困扰了我几个小时,并寻求 mysql 专家的帮助。 :) 提前谢谢你。

表:t1;列:名称

给定表格:

name
-----
$abc|def|$cde
efd|$acd
$gcb|$bvv|ggg

预期结果(只拉取不带$前缀的字符串,管道表示字段值分隔符):

name
-----
def
efd
ggg
-- Sql to create and insert
create table t1 (name varchar(100));
        insert into t1 (name) values ('$abc|def|$cde');
        insert into t1 (name) values ('efd|$acd');
        insert into t1 (name) values ('$gcb|$bvv|ggg');

Mysql版本:5.6.40

【问题讨论】:

1) 考虑不在表中存储管道分隔的数据,2) 考虑升级到 MySQL 8+。这个查询在 MySQL 5 上会很难看。 每列值的单独“管道”值的最大数量是多少? 【参考方案1】:
SELECT DISTINCT
       name, SUBSTRING_INDEX(SUBSTRING_INDEX(t1.name, '|', num), '|', -1) one_value
FROM t1
/* max 3 subnames per name - expand if needed */
CROSS JOIN (SELECT 1 num UNION SELECT 2 UNION SELECT 3) numbers
HAVING one_value NOT LIKE '$%';

fiddle

【讨论】:

@amine 在这种情况下考虑接受这个答案。 抱歉,有时需要消化并使用更多子名称,我已附加一个新条目 $gcb|$bvv|$ggg|$ste|sgg 并在其中添加联合更多子名称。查询结果确实返回一些重复项。这是此查询的预期行为,如果这是预期行为,我稍后可以将它们传递给不同的函数以删除欺骗。 dbfiddle.uk/… :) @amine 最简单的解决方案 - SELECT DISTINCT ...。已更新。【参考方案2】:

在 MySQL 8+ 上,您可以尝试:

SELECT
    col,
    REGEXP_REPLACE(CONCAT('|', col, '|'), '^.*\\|([a-z]+)\\|.*$', '$1') AS col_out
FROM yourTable;

这里的想法是从这个稍微修改的列值开始:

|$abc|def|$cde|

然后,我们搜索由管道包围的仅字母序列,并替换为捕获的组。

Demo

【讨论】:

@Akina 感谢您的反馈,我最初是在手机上回答的,因此无法进行任何测试。问题是元字符在调用REGEXP_REPLACE 时似乎需要双重转义。更新的版本现在可以使用了。 如果有多个没有$ 的子值,那么只会返回最后一个...从另一边来看,OP 不会显示这样的值。 现在您看到了我们甚至不希望出现的边缘情况。如果可能有多个匹配项,那么 OP 绝对应该 规范化 数据并停止以这种方式存储它。一列值应生成一个输出值。 感谢 Akina 和 Tim,非常感谢您提供的代码和反馈,并进行思考。它只是该领域的一个子值(我的错,应该早点澄清)。代码很清楚,非常感谢你,我希望。不幸的是,我仍然必须坚持使用旧的 mysql 版本,直到我真的希望我们有机会升级它。

java中的正则表达式

正则表达式:正则表达式(regularexpression)描述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。一些字符所代表的意思:   &nbs... 查看详情

acm中的正则表达式(代码片段)

...索,替换那些符合某个模式(规则)的文本;正则表达式是对字符串(包括普通字符,例如:a到z之间的字母)和特殊字符(称为“元字符”)操作的一种逻辑公式,就是用事先定义好的一些特定字符,及这些特定字符的组合,组成一个“规则字符... 查看详情

pyhon正则表达式

...配一个换行符。序列‘‘匹配""而"("则匹配"("。^匹配输入字符串的开始位置。如果设置了RegExp对象的Multiline属性,^也匹配‘‘或‘‘之后的位置。$匹配输入字符串的结束位置。如果设置了RegExp对象的Multiline属性,$也匹配‘‘或... 查看详情

正则表达式手册(代码片段)

...符。串行“\”匹配“”而“(”则匹配“(”。^匹配输入字符串的开始位置。如果设置了RegExp对象的Multiline属性,^也匹配“”或“”之后的位置。$匹配输入字符串的结束位置。如果设置了RegExp对象的Multiline属性,$也匹配“”或... 查看详情

正则表达式在java中的应用(代码片段)

本文介绍正则表达式在java中的一些应用:1)判断字符串中是否含有指定子字符串2)捕获字符串中匹配的子字符串3)替换字符串中指定的子字符串4)根据不同情况动态替换字符串中的匹配的子字符串1、判断... 查看详情

mysql高阶语句

...EGEXP操作符所支持的匹配模式如表所示。元字符作用^匹配字符串的开始位置$匹配字符串的结束位置.匹配除\\n(换行)之外的任意一个字符*匹配前面的字符串0次或多次[list]匹配list列表中的一个字符[^list]匹配不在list列表... 查看详情

正则表达式语法表(代码片段)

...符。串行“\”匹配“”而“(”则匹配“(”。^匹配输入字符串的开始位置。如果设置了RegExp对象的Multiline属性,^也匹配“”或“”之后的位置。$匹配输入字符串的结束位置。如果设置了RegExp对象的Multiline属性,$也匹配“”或... 查看详情

mysql正则表达式

...为REGEXP同义词,见下2.REGEXP()完整表达式exprREGEXPpat>如果字符串expr与模式pat指定的正则表达式匹配,则返回1,否则返回0。>如果expr或pat为NULL,则返回值为NULL。>正则表达式规则明细及使用案例见下方。3.NOTREGEXP()完整表达式... 查看详情

正则表达式匹配字母数字,除了特定的子字符串

】正则表达式匹配字母数字,除了特定的子字符串【英文标题】:Regextomatchalphanumericexceptspecificsubstring【发布时间】:2021-08-0412:28:57【问题描述】:编辑:强制性条件:正则表达式必须插入以下语句:Regexregex=newRegex("<REGEX_STRING... 查看详情

正则表达式(代码片段)

简介正则表达式(regularexpression)描述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。字符描述\\将下一个字符标记为一个特... 查看详情

使用基于正则表达式的部分匹配来选择 Pandas 数据帧的子数据帧

...个Pandas数据框,它有两列,一列(“流程参数”列)包含字符串,另一列(“值”列)具有相应的浮点值。我需要过滤掉与列“流程参数”中的一组键部分匹配的子数据 查看详情

正则表达式:如何匹配不以前缀列表开头的子字符串

】正则表达式:如何匹配不以前缀列表开头的子字符串【英文标题】:Regex:Howtomatchsubstringsnotstartingwithalistofprefixes【发布时间】:2019-09-2715:39:30【问题描述】:我需要替换字符串中匹配的单词,但不包括这些单词的前缀列表。Them... 查看详情

学习笔记:正则表达式

一、限定符^:匹配字符串的开始位置。$:匹配字符串的结束位置。():子表达式的开始和结束位置。[]:中括号表达式的开始和结束位置。{}:限定符表达式的开始和结束位置。*:匹配前面的子表达式零次或多次。+:匹配前面... 查看详情

理解正则表达式的匹配关系

 疑问: 正则表达式所表示的字符串是属于目标字符串的子串,还是目标字符串属于正则表达式所表示的字符串之一? 这一点经常容易搞混!! 下面是自己的理解,记录在这里,也帮助自己理清这个关系: 正... 查看详情

bash shell中字符串匹配正则表达式的子字符串[重复]

】bashshell中字符串匹配正则表达式的子字符串[重复]【英文标题】:Substringofstringmatchingregexinabashshell[duplicate]【发布时间】:2017-11-0907:47:40【问题描述】:在bashshell中,我想获取与正则表达式匹配的给定字符串,然后获取字符串... 查看详情

如何替换 Javascript 中的正则表达式子字符串匹配?

】如何替换Javascript中的正则表达式子字符串匹配?【英文标题】:HowcanIreplacearegexsubstringmatchinJavascript?【发布时间】:2011-04-0514:40:22【问题描述】:varstr=\'asd-0.testing\';varregex=/asd-(\\d)\\.\\w+/;str.replace(regex,1);这会将整个字符串str替... 查看详情

hive正则表达式(代码片段)

hive正则正则表达式描述了一种字符串匹配的模式,可以用来检查一个字符串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。正则表达式是由普通字符以及特殊字符组成的文字模式。普通字符... 查看详情

数据分析走进数据分析4正则表达式(代码片段)

...识.正则表达式正则表达式(RegularExpression)是一种用来匹配字符串的强有力的工具.可以帮助我们提取我们想要的信息.字符字符描述$匹配输入字符串的结尾位置()标记一个子表达的开始和结束位置*匹配前面的子表达0次或多次+匹... 查看详情