正则表达式替换或分隔列表

时间:2014-01-15 06:03:21

标签: javascript regex

用户可以在输入框中输入OR或AND分隔的关键字进行搜索。 我需要获取关键字并将其替换为执行搜索所需的应用程序查询字符串。

示例1

用户输入

ThiS or That or That one

将其替换为

[fieldName] like 'ThiS%' OR [fieldName] like 'That%' or [fieldName] like 'That one%'

我需要使用javascript 替换功能

来执行此操作

3 个答案:

答案 0 :(得分:1)

使用捕获组:

var pattern = /(.+?)(\s+or\s+|\s+and\s+|\s*$)/ig;
'ThiS or That and That one'.replace(pattern, "[fieldName] like '$1%'$2");
// => "[fieldName] like 'ThiS%' or [fieldName] like 'That%' and [fieldName] like 'That one%'"
  • ([\w\s]+?)匹配单词/空格(非贪婪)。 - >第1组
  • (\s+or\s+|\s+and\s+|\s*$)匹配orand或字符串末尾的可选空格。 - >第2组
  • 整个模式匹配单词后跟or / and或字符串末尾。

<强>更新

如果你想要转义特殊字符:

var pattern = /(.+?)(\s+or\s+|\s+and\s+|\s*$)/ig;
'Th_iS or T"hat and Th%t one'.replace(pattern, function($0, $1, $2) {
    return "[fieldName] like '" + $1.replace(/(['"_%\\])/, '\\$1') + " %'" + $2;
});
// => "[fieldName] like 'Th\_iS %' or [fieldName] like 'T\"hat %' and [fieldName] like 'Th\%t one %'"

答案 1 :(得分:0)

function generateQueryString(input) {
    return (input + ' or ')
        .replace(/\\|'/g, '')
        .replace(/\s*(.*?\S)\s+(or|and)/ig, "[fieldName] like '$1%' $2 ")
        .replace(/\s+or\s+$/g, '');

}

请注意,包含冲突的'标记的关键字或搜索短语可用于代码注入,对于包含反斜杠的搜索字词(至少)也是如此。这两个字符正在提前从输入中删除。

另外,我正在添加/i标志,因为我认为输入应该不区分大小写。有些用户可能输入或有些OR。

像这样调用函数

queryString = generateQueryString("ThiS OR That AND That one");

制作:[fieldName] like 'ThiS%' OR [fieldName] like 'That%' AND [fieldName] like 'That one%'

答案 2 :(得分:0)

使用regexp的另一个变种

"ThiS or That or That one".replace(/(.+?)((?:or|and)(.+?))|(.+)/gi, 
         function(a,b,c){
             return '[fieldName] like \''+(b||a).trim()+'%\' ' + (c||'');
         })