0

这一页

有一个很好的例子,使用 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 作为模式匹配的示例。我很欣赏对正则表达式的澄清。

4

2 回答 2

1

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

于 2009-11-11T19:14:28.437 回答
0

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

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

于 2009-11-11T18:34:49.817 回答