0

我正在使用基于 RegEx 的自动 ronconciliation 工具。我想匹配两个名字。示例:"John Francis Edward Smith"与 比较"John Smith"。另外,由于名称可能包含错误,我只比较第一个单词的前三个字母和最后一个单词的前三个字母。因此,这里的积极匹配将是:"Joh"并且"Smi"在双方。我可以构建表达式(^\D{3}).*\s+(?=\S*$)(\D{3}).*$,但问题是引擎进行了两个分组并在它们上使用 OR 运算符,而我需要 AND 所以两者都需要是正确的。我什么都试过了。有什么建议么?

4

2 回答 2

0

如果你需要避免分组,你可以尝试一些简单的事情,比如

\bJoh.*\bSmi

这将匹配一个包含“Joh”和“Smi”的字符串,并注意每个三个字母序列开始一个单词(因此它不会匹配“John ClineSmith”)

编辑

我不是专门找约翰史密斯。我正在尝试提取姓名的第 3 个字母和姓氏的第 3 个字母,其中 name-lastname 输入可能有 1 个或多个中间名(例如:John Robert James Smith)。但它不能是两个分组,结果必须是一个单词(即上例中的'JohSmi')。

很抱歉成为坏消息的承担者,但是您所要求的不能纯粹用正则表达式来完成。正则表达式旨在匹配一系列字符,一个接一个,不中断。您可以使用分组从最终匹配中提取子序列,也可以执行多个匹配,但正则表达式匹配将始终返回从第一个匹配字符到最后一个匹配字符的完整序列(不跳过)。

您要求的是一个正则表达式,它从匹配的开头返回 3 个字符,从结尾返回 3 个字符,中间没有任何字符。这是一个损坏的序列,我知道没有任何正则表达式引擎能够做到这一点。您将不得不使用额外的代码(php 或任何您的工具)或放弃此方法并尝试寻找替代方法。

这个问题涵盖了相同的领域:Regular expression to skip character in capture group

于 2013-01-30T23:42:05.543 回答
0

假设我正确理解了您的问题,这对我有用

/^(\D{3}).*(\b[^\s]{3})/ 

^锚点到行 首贪婪地尽可能多地 (\D{3})捕获第一组 发现“单词边界” 是三个不是空格的字符 我猜 \S{3} 也可以.*\b[^\s]{3}

诀窍是 .*\b 将找到字符串中的最后一个单词边界

于 2013-01-25T14:35:14.270 回答