Mysql 为什么这个regexp查询不返回任何结果?
你好 我有一个字段,它的行看起来像Mysql 为什么这个regexp查询不返回任何结果?,mysql,sql,Mysql,Sql,你好 我有一个字段,它的行看起来像 BBB-888-8557ZZV-003.XYZ BBB-999-8787ZZV-00D.XYZ 我需要查找(并在确认select返回正确的行:)与正则表达式匹配的所有记录: /-\d\d[A-Z]/g 因此,所有字段都有一个减号,后跟两个数字和一个字母 我还只需要过滤掉其中包含999的字段 我尝试了以下SQL,但未返回任何结果: SELECT * FROM `track` WHERE ( pod LIKE "BBB-999%" AND pod RE
BBB-888-8557ZZV-003.XYZ
BBB-999-8787ZZV-00D.XYZ
我需要查找(并在确认select返回正确的行:)与正则表达式匹配的所有记录:
/-\d\d[A-Z]/g
因此,所有字段都有一个减号,后跟两个数字和一个字母
我还只需要过滤掉其中包含999的字段
我尝试了以下SQL,但未返回任何结果:
SELECT *
FROM `track`
WHERE (
pod LIKE "BBB-999%"
AND pod
REGEXP '/-\d\d[A-Z]/g'
)
此外,一旦发现这些字段存在以下问题,有什么原因可以快速替换这些字段:
BBB-999-8787ZZV-_MARK_D.XYZ
在对查询进行限制后,可以使用
CONCAT()
函数在输出中获取替换项
SELECT CONCAT(SUBSTRING(pod, 1, LENGTH(pod) - LOCATE('-', REVERSE(pod)) + 1),
'_MARK_D.XYZ')
FROM `track`
WHERE
(
pod LIKE "BBB-999%"
AND pod REGEXP '-[0-9][0-9][A-Z]'
)
出于某种原因,我需要在MySQL正则表达式中使用[0-9]
,以使其正常工作
单击下面的链接查看正在运行的演示:
如果您想实际更改pod
列中的值,可以尝试更新
:
UPDATE `track`
SET pod = CONCAT(SUBSTRING(pod, 1, LENGTH(pod) - LOCATE('-', REVERSE(pod)) + 1),
'_MARK_D.XYZ')
WHERE
(
pod LIKE "BBB-999%"
AND pod REGEXP '-[0-9][0-9][A-Z]'
)
mysql
中的数字应该像[0-9]或[[:digit:][code>
\d
无法按预期工作
尝试
或
用-MARK[A_Z].XYZ更新具有-00[A-Z].XYZ的字段
然后字符串的长度会发生变化(根据注释)
最后8个字符可以是\-[0-9]{3}.XYZ
或\-[0-9]{2}[A-Z]{1}.XYZ
尝试:
我现在可以用了。诀窍是使用[0-9]
表示正则表达式中的任何数字。请尝试使用SQL Fiddle来说服自己。您好@tim biegeleisen,感谢这项工作正在进行,我如何替换实际表中的select找到的值,而不仅仅是将其显示在输出中?感谢Praveen,这项工作100%有效。我现在如何将所有00[A-Z]匹配项替换为_MARK_[A-Z]在表中?Ispod
值是具有xxx-xxx-xxxxxxx-xxx的固定长度数据。xxx
模式??您好,不,不是。它总是以BBB-999开头,然后是数字和字母的组合,后跟'\-[0-9]{3}'或'\-[0-9]{2}[a-Z]{1}',然后是.XYZ我需要用MARK Hope替换regexp找到的所有00,这很有意义:)我已经给了你一个解决方案,可以处理任意长度的字符串。如果有机会,请看一看,谢谢。
SELECT *
FROM `track`
WHERE
pod LIKE "BBB-999%" and
pod REGEXP '\-[0-9]{2}[A-Z]{1}'
SELECT *
FROM `track`
WHERE
pod LIKE "BBB-999%" and
pod REGEXP '\-[[:digit:]]{2}[A-Z]{1}'
UPDATE `track`
SET `pod` = concat(reverse(substr(reverse( `pod` ) from 8)), 'MARK', substr( `pod` from -5))
WHERE
`pod` LIKE "BBB-999%" and
`pod` REGEXP '\-0{2}[A-Z]{1}';