MySQL字符串匹配多个单词

时间:2009-11-11 18:30:20

标签: mysql regex string pattern-matching

This page

有一个很好的例子,使用REGEXP进行模式匹配。 REGEXP的问题与以下字符串不匹配:

  • “约翰先生”
  • “约翰博士”
    甚至:
  • “John Doe先生”

字符串“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 个答案:

答案 0 :(得分:1)

正则表达式并不意味着匹配不精确的字符串(例如,拼写错误)。看起来这就是你想要做的事情。例如,可以使用正则表达式来匹配任何社会安全号码(三个数字后跟连字符后跟两个数字,后跟另一个连字符后跟四个数字)。但你无法使用正则表达式来匹配约翰的拼写错误。使用一些更高级的编码处理拼写错误,通常称为n-gram匹配(参见:http://en.wikipedia.org/wiki/N-gram)。如果您还使用Ruby-on-Rails,那么有一个很棒的Gem(称为Chrononaut-no_fuzz)来为您处理这个问题,但是对于普通的MySQL,您可能需要手动编写此功能。

答案 1 :(得分:0)

John Doe应该匹配的字符串是最后一个。你能否发布确切的sql和它试图匹配的数据

好的,所以你将字符串和模式混合在一起,为regexp提供了一个匹配字符串的模式。因此,例如John博士永远不会匹配John,因为模式试图匹配Dr并且失败。然而约翰将匹配约翰博士,因为现在这种模式在约翰博士中找到约翰。我给你的建议是阅读正则表达式入门书。