regex 多词匹配

5n0oy7gb  于 2023-10-22  发布在  其他
关注(0)|答案(2)|浏览(148)

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

nfs0ujit

nfs0ujit1#

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

643ylb08

643ylb082#

John Doe应该匹配的字符串是最后一个。你能不能把准确的sql和它试图匹配的数据贴出来
好的,那么你把字符串和模式弄混了,你提供一个模式给regexp来匹配一个字符串。例如,博士。John永远不会匹配John,因为模式试图匹配Dr但失败了。然而,约翰将匹配约翰博士,因为模式现在在约翰博士中找到约翰。我的建议是读一本正则表达式入门书。

相关问题