正则表达式:允许变量搜索字符串中的某些字符

时间:2018-01-17 22:14:38

标签: javascript regex search

我试图在 js 中使用正则表达式来搜索名称列表中的名称。 我希望用户允许在输入中抛出某些字符(-_,空格),但仍能找到正确的结果。

e.g。

如果名称为"New York",则应匹配:

"New York"
"newyork"
"new york"
"new-york"
"new_york"
" New york"

这当然不是所有的可能性。我真的不确定如何处理这个问题。

修改 谢谢你的快速答案。

我想我没有说清楚我的问题。我的目标是查找输入字符串是否包含在字符串列表中。输入的字符必须与列表中的元素匹配,但忽略这些特定字符。

5 个答案:

答案 0 :(得分:2)

正则表达式\s?\w+[\s-_]?\w+

<强>详情:

\s匹配任何等于[\ r \ n \ t \ f \ v]的空白字符

\w匹配任何等于[a-zA-Z0-9 _]

的单词字符

+在一次和无限次之间匹配

[]匹配列表中的单个字符

?匹配0到1次

Regex demo

答案 1 :(得分:2)

你是对的,Regex是完美的。

var name = 'New~York';
if (name.match(/^[a-zA-Z-_ ]+$/g) == null) {
    alert('Name contains invalid characters');
}

答案 2 :(得分:2)

我认为你应该从查询字符串和列表中的项目中删除允许的字符,然后对两个字符串的其余部分进行简单的比较:

var regex = /[-_ ]/g;                                            // regex containing the allowed chars (g modifier required)

var query = "New York";                                          // the query string to be used for searching
var list = [/* list of words */];                                // the list to get matches from

query = query.replace(regex, "").toLowerCase();                  // remove the allowed chars from the query and convert it to lowercases

var matches = list.filter(function(word) {                       // for each word in the list
    return query === word.replace(regex, "").toLowerCase();      // remove the allowed chars, convert to lowercases, then compare with the altered query (if they matched then return true)
});

示例:

var list = ["New York", "New Fork", "newyork", "new york", "new-york", "new_york", " New york", "new orky", "---n-e_w-   y____o_-rk_-_-_-"];

var regex = /[-_ ]/g;

var query = prompt("Enter the query yo!", "Ne---w-_---York") || "";

query = query.replace(regex, "").toLowerCase();

var matches = list.filter(function(word) {
    return query === word.replace(regex, "").toLowerCase();
});

console.log(matches);

答案 3 :(得分:1)

您可以根据目标字符串制作正则表达式模式。我会在使用.toLowerCase()进行比较之前将所有字符串转换为小写,使用.split('')按空格分割,然后使用前面,后面和空格中的[\ s _-] *从部分构建正则表达式

AppBarLayout

答案 4 :(得分:0)

感谢您的帮助!

我终于通过替换搜索中的字符以及目标字符串并将它们相互匹配来获得解决方案:

regex = new RegExp(input.replace(/[-\s_'´`]+/i, ''), "i");
if (regex.test(target.replace(/[-\s_'´`]+/i, ''))){ ... }