This page
有一个使用REGEXP进行模式匹配的很好的例子。REGEXP的问题与以下字符串不匹配:
- “约翰先生”
- “约翰医生”
或者甚至:
- “无名氏先生”
字符串“John Doe”
我想知道我如何获得任何给定示例的正匹配?
下面是一个示例代码:
Drop table Names;
CREATE TABLE Names (
first_name VARCHAR(20),
last_name VARCHAR(20)
);
INSERT INTO Names VALUES ('John','Doe');
INSERT INTO Names VALUES ('Sue','Yin');
INSERT INTO Names VALUES ('Diego James', 'Franco');
select * from Names;
/*To find names containing a string */
/*I want this to march John Doe*/
SELECT * FROM Names WHERE first_name REGEXP 'Mr John';
/*This has John misspelled, I want it to match John Doe */
SELECT * FROM Names WHERE first_name REGEXP 'Hohn' AND last_name REGEXP 'Doe';
/*And this would match Diego James Franco*/
SELECT * FROM Names WHERE first_name REGEXP 'Dr Diego' AND last_name REGEXP 'Franco';
问题不在于如何使用正则表达式来进行我想要的匹配,而是如何在不考虑REGEXP的情况下进行匹配。我使用REGEXP作为模式匹配的一个例子。我很欣赏对正则表达式的澄清。
2条答案
按热度按时间nfs0ujit1#
正则表达式并不意味着匹配不精确的字符串(例如,拼写错误)。看起来这就是你试图做的。例如,可以使用正则表达式来匹配任何社会安全号码(三个数字,后跟一个连字符,后跟两个数字,后跟另一个连字符,后跟四个数字)。但是您不能使用正则表达式来匹配John的拼写错误。拼写错误使用一些更花哨的编码来处理,通常称为n-gram匹配(参见:http://en.wikipedia.org/wiki/N-gram)。如果你也在使用Ruby-on-Rails,有一个很好的Gem(叫做Chrononaut-no_fuzz)可以为你处理这个问题,但是对于普通的MySQL,你可能需要手工编写这个特性。
643ylb082#
John Doe应该匹配的字符串是最后一个。你能不能把准确的sql和它试图匹配的数据贴出来
好的,那么你把字符串和模式弄混了,你提供一个模式给regexp来匹配一个字符串。例如,博士。John永远不会匹配John,因为模式试图匹配Dr但失败了。然而,约翰将匹配约翰博士,因为模式现在在约翰博士中找到约翰。我的建议是读一本正则表达式入门书。