正则表达式:忽略字符串比较中的字符

Posted

技术标签:

【中文标题】正则表达式:忽略字符串比较中的字符【英文标题】:Regex: Ignore Characters in String Comparison 【发布时间】:2017-04-13 16:56:21 【问题描述】:

我正在尝试寻找一个正则表达式来代替这个想法:

if($input === numbers_only($phone_number)) 
    // do something

假设

$input 总是是数字

numbers_only() 去除所有非数字字符

上下文

一天结束时,我需要编写一个 mysql 查询来针对格式化为 TEXT 的列执行此操作,这就是为什么我不能简单地使用上述函数的原因。所以它看起来像:

SELECT 
    number
FROM
    phones
WHERE
    number REGEXP '...'

这是正则表达式可以处理的事情吗?

更新

我认为,如果 MySQL 中的 CONVERT() 方法可以处理将 TEXT(不是 varchar)转换为 INT 以进行比较,那么可以更好地表达这个问题(或另一种解决方法)。

【问题讨论】:

How do you extract a numerical value from a string in a MySQL query?的可能重复 ***.com/questions/6604455/… ,如有误解,请见谅。 感谢@Progrock - 不幸的是,它链接到一个 preg_replace(),它是 php,最后,我需要它是 MySQL @Bobot - 谢谢,看起来这需要通过一个函数。我认为作为一个单一的正则表达式没有办法做到这一点? 虽然 sql 中没有 preg_replace_callback ...顺便说一句,您可以通过构建像 <firstDigit>%<secondDigit>%... 这样的正则表达式来做一些事情 【参考方案1】:

最好在存储在表中之前清理数据。这样,您就拥有客户端语言的全部功能,您可以在其中执行preg_replace('/[^0-9]+/', '', $num)(如果是 PHP)之类的操作。也许您应该现在努力修复所有数据?

但是,假设您被列中的垃圾卡住了,让我们看看我们能做些什么。

您似乎在谈论电话号码?只有少数可能存在的字符(也许是“-()”)?所以...

WHERE $num = REPLACE(...(REPLACE(number, '-', ''), '(', '')...)

真的很乱。而且效率真的很低。

【讨论】:

感谢 Rick James - 我认为这是最好的解决方案,而不是简单地硬着头皮将列类型更改为另一种格式,以便我可以运行 CAST() 或 CONVERT() 函数就可以了(如果我正确理解了这些功能)。感谢您的帮助! 我看不出CASTCONVERT 会有什么帮助,除非所有数字都在开头。 Rick James - 你说得对,我做了更多的测试,并且 cast/convert 似乎在第一个非数字字符之后切断了所有文本。因此,假设我们想要完成清理当前数据的工作,那么真正将其转换为 INT(x) 列看起来就是解决方案。你也这么看吗? 我相信在插入数据库之前清理数据。在极少数情况下,我会将原始字符串保留在一列中,将可搜索(仅数字)字符串保留在另一列中。 (清理后的列是否为INTINT UNSIGNEDBIGINTVARCHAR(22) CHARACTER SET ascii 等,这是一个小问题。)

以上是关于正则表达式:忽略字符串比较中的字符的主要内容,如果未能解决你的问题,请参考以下文章

使用正则表达式进行字符串比较

java中怎么替换string中的某个字符

正则表达式 - 获取引号中的字符串忽略转义的引号和评论

如何忽略正则表达式主题字符串中的空格?

正则表达式 - 查找所有空格并忽略多行字符串中的连字符分隔的单词

正则表达式模式忽略输入字符串中的内括号