使用正则表达式匹配一个或多个单词的一部分

时间:2012-10-20 22:31:45

标签: javascript jquery regex

我是正则表达式的新手,并且遇到了一些基本的问题。

var name = "robert johnson";
var searchTerm = "robert johnson";

if (searchTerm.match(name)) {
    console.log("MATCH");
}

我想尝试找到符合以下任何条件的内容:

rob, robert, john, johnson, robertjohnson

为了使正则表达式更简单,我已经在“name”和“searchTerm”变量中添加了.toLowerCase()。

需要在searchTerm.match(name)中添加什么正则表达式才能使其正常工作?

澄清:我不只是试图通过我给出的5个例子来测试,我正试图想出一些正则表达式,其中任何一个测试都会通过。所以,例如:

searchTerm.match(name)

......需要改为:

searchTerm.match("someRegexVoodooHere"+name+"someMoreRegexVoodooHere")

所以,如果我编辑

var searchTerm = "robert johnson";

......待

var searchTerm = "rob";

...相同的函数searchTerm.match指令可以正常工作。

同样,我是正则表达式的新手,所以我希望我能清楚地问这个问题。基本上我需要编写一个函数,它接受任何searchTerm(它不包括在这里,但在其他地方我要求输入至少3个字符)并且可以检查在给定的字符串中是否按顺序找到这3个字母“名字姓氏”。

4 个答案:

答案 0 :(得分:5)

"robert johnson".match(/\b(john(son)?|rob(ert(johnson)?)?)\b/)

将为您提供所有可能的匹配(如果您需要查找输入字符串是否包含任何单词,则会有多个匹配。

/\b(john(son)?|rob(ert(johnson)?)?)\b/.test("robert johnson")
如果字符串有任何匹配,

将返回true。 (最好在条件中使用它,因为你不需要找到所有匹配项。)

  • \b - 表示字边界。
  • () - 捕获群组。
  • ? - 量词“one or none”。
  • | - 逻辑“或”。

答案 1 :(得分:2)

正则表达式查找匹配的模式。您的问题的答案在某种程度上取决于您希望实现的目标 - 也就是说,您实际上是想要匹配的组还是仅仅测试是否存在执行其他代码的模式。

要匹配字符串中的值,您需要使用布尔OR与|匹配 - 使用i标志将导致不区分大小写的匹配,因此您无需调用{ {1}} -

toLowerCase()

如果您想要更复杂的正则表达式来匹配所有这些变体 -

var regex = /(rob|robert|john|johnson|robertjohnson)/i;
regex.match(name);

这将导致var names = "rob, robert, john, johnson, robertjohnson, paul"; var regex = /\b((rob(ert)?)?\s?(john(son)?)?)\b/i; var matches = regex.match(names); 数组有5个元素(除了“paul”之外的每个名称)。值得注意的是,这也会与其他名字相匹配,例如“rob johnson”和“rob john”,这可能并不理想。

您也可以使用matches -

测试您的字符串是否包含任何这些字词
test()

答案 2 :(得分:2)

您可以创建测试术语的数组并循环遍历该数组。这种方法意味着在动态环境中构建不那么复杂的正则表达式

var name = "robert johnson";
var searchTerm = "robert johnson";

var tests = ['rob', 'robert', 'john', 'johnson', 'robertjohnson'];
var isMatch = false;

for (i = 0; i < tests.length; i++) {
    if (searchTerm.test(tests[i])) {
        isMatch = true;
    }
}

alert(isMatch)

答案 3 :(得分:1)

/^\s*(rob(ert)?|john(son)?|robert *johnson)\s*$/i.test(str)

如果str匹配,

将返回true:

  • 抢劫
  • 罗伯特
  • 约翰
  • 约翰逊
  • robertjohnson
  • robert johnson
  • 罗伯特约翰逊(这两者之间的空格并不重要)

并且它不关心是否有前面或后面的空字符。如果您不想这样,请从模式的开头和结尾删除\s*。此外,名称和姓氏之间的空格和星号允许这两者之间有0个或更多空格。如果您不希望它包含任何空格,只需删除该空格和星号。

插入符^表示字符串的开头,美元符号$表示字符串的结尾。最后,最后的i标志使搜索不敏感。

相关问题