4

我是正则表达式的新手,对一些基本的东西有困难。

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

4 回答 4

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

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

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

true如果字符串有任何匹配,将返回。(最好在条件中使用它,因为您不需要找到所有匹配项)。

  • \b- 表示单词边界。
  • ()- 捕获组。
  • ?- 量词“一或无”。
  • |- 逻辑“或”。
于 2012-10-20T22:43:18.620 回答
2

正则表达式查找模式以进行匹配。您的问题的答案在某种程度上取决于您希望完成什么 - 也就是说,您是否真的想要匹配的组或只是为了测试是否存在执行其他代码的模式。

要匹配字符串中的值,您需要使用布尔或匹配|- 使用该i标志将导致不区分大小写的匹配,因此您无需调用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);

这将导致matches数组有 5 个元素(除“paul”之外的每个名称)。值得注意的是,这也会匹配其他名称,例如可能不需要的“rob johnson”和“rob john”。

test()您也可以使用-测试您的字符串是否包含这些术语中的任何一个

var name = "rob johnson";
var regex = /\b((rob(ert)?)?\s?(john(son)?)?)\b/i;
if (regex.test(name)){
   alert('matches!');
}
于 2012-10-20T22:42:07.283 回答
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)
于 2012-10-20T22:43:23.983 回答
1

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

str如果匹配,将返回 true :

  • 罗伯特
  • 约翰
  • 约翰逊
  • 罗伯特约翰逊
  • 罗伯特·约翰逊
  • 罗伯特·约翰逊(这两个之间的空格无关紧要)

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

插入符号^表示字符串的开头,美元符号$表示字符串的结尾。最后,最后的i标志使它不区分大小写。

于 2012-10-20T22:48:48.887 回答