REGEXP MySQL - 几个组,无论哪个顺序

时间:2018-02-07 12:26:13

标签: mysql regex sorting

我尝试在MySQL中创建一个REGEX但在阅读其他示例4小时后尝试&错误我希望有人可以帮助我修复我的正则表达并让它工作。

我需要的是: 在seperatet(“###”)文本中匹配多个字符串,无论它们位于哪个位置/顺序“### TEXT ### TEXT ###“

我的正则表达式到目前为止工作,但只有正确的顺序中的字符串像正则表达式。所以我不得不说我的正则表达式搜索STRING1&& STRING2内部### ###无论在哪个位置。

###([^#]*)(9034==1-wellig)([^#]*)(9037==DIN C4)([^#]*)###

我的文字:

###9021==220|9034==1-wellig|9023==356|9024==230|9037==DIN C4###9021==220|9034==2-wellig|9023==356|9037==DIN C4|9024==230###9021==220|9034==1-wellig|9023==356|9037==DIN C4|9024==230###

当我将我的文本修改为类似的内容(“9034 == 1-wellig”之前的“9037 == DIN C4”)时,它不起作用:

###9021==220|9037==DIN C4|9034==1-wellig|9023==356|9024==230###9021==220|9034==2-wellig|9023==356|9037==DIN C4|9024==230###9021==220|9037==DIN C4|9034==1-wellig|9023==356|9024==230###

示例:https://regex101.com/r/amal7c/1

我希望我清楚地解释了我的问题,我确定这只是一个很小的改变,但我没有让它工作......

最诚挚的问候 汤姆

2 个答案:

答案 0 :(得分:1)

你不能在MySQL正则表达式中使用lookarounds,你需要使用替换:

WHERE col REGEXP '###[^#]*(9034==1-wellig[^#]*9037==DIN C4|9037==DIN C4[^#]*9034==1-wellig)[^#]*###'

请参阅this regex demo

<强>详情

  • ### - 文字###
  • [^#]* - 除#
  • 以外的零个或多个字符
  • (9034==1-wellig[^#]*9037==DIN C4|9037==DIN C4[^#]*9034==1-wellig) - 交替捕获组匹配
    • 9034==1-wellig[^#]*9037==DIN C4 - 9034==1-wellig,除#9037==DIN C4以外的零个或多个字符
    • | - 或
    • 9037==DIN C4[^#]*9034==1-wellig - 9037==DIN C4,除#9034==1-wellig以外的零个或多个字符
  • [^#]*### - 除了#之外的零个或多个字符,后跟###

答案 1 :(得分:0)

OMG好吧我想我自己找到了解决方案,它在regex101上运行但在MySQL中没有:/

###(?=[^#]*(9034==1-wellig))(?=[^#]*(9037==DIN C4))[^#]*###

但如果你们中的一些专家可以提高我的正则表达式,我也非常感谢:)

https://regex101.com/r/amal7c/2