正则表达式:忽略字符串比较中的字符
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() 函数就可以了(如果我正确理解了这些功能)。感谢您的帮助! 我看不出CAST
或CONVERT
会有什么帮助,除非所有数字都在开头。
Rick James - 你说得对,我做了更多的测试,并且 cast/convert 似乎在第一个非数字字符之后切断了所有文本。因此,假设我们想要完成清理当前数据的工作,那么真正将其转换为 INT(x) 列看起来就是解决方案。你也这么看吗?
我相信在插入数据库之前清理数据。在极少数情况下,我会将原始字符串保留在一列中,将可搜索(仅数字)字符串保留在另一列中。 (清理后的列是否为INT
、INT UNSIGNED
、BIGINT
、VARCHAR(22) CHARACTER SET ascii
等,这是一个小问题。)以上是关于正则表达式:忽略字符串比较中的字符的主要内容,如果未能解决你的问题,请参考以下文章