我正在使用基于RegEx的自动协调工具。我想匹配两个名字。示例:"John Francis Edward Smith"
与"John Smith"
进行比较。另外,由于名称可能包含错误,我只比较第一个单词的前三个字母和最后一个单词的前三个字母。因此,这里的积极匹配是:"Joh"
和"Smi"
。我可以构建表达式(^\D{3}).*\s+(?=\S*$)(\D{3}).*$
,但问题是引擎发出两个分组并对它们使用OR运算符,而我需要AND,因此两者都需要正确。我已经尝试了一切。有什么建议吗?
答案 0 :(得分:0)
假设我理解你的问题,这对我有用
/^(\D{3}).*(\b[^\s]{3})/
^
锚点开头
(\D{3})
捕获第一组
.*
贪得无厌
\b
找到“字边界”
[^\s]{3}
是三个不是空格的字符,我猜\ S {3}也可以用来
诀窍是。* \ b将在字符串中找到最后一个字边界
答案 1 :(得分: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