Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/477.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 要替换或分隔列表的正则表达式_Javascript_Regex - Fatal编程技术网

Javascript 要替换或分隔列表的正则表达式

Javascript 要替换或分隔列表的正则表达式,javascript,regex,Javascript,Regex,用户可以在输入框中输入或分隔的关键字进行搜索。 我需要将关键字替换为执行搜索所需的应用程序查询字符串 示例1 用户输入 ThiS or That or That one 将其替换为 [fieldName] like 'ThiS%' OR [fieldName] like 'That%' or [fieldName] like 'That one%' 我需要使用javascript替换函数使用捕获组执行此操作: var pattern = /(.+?)(\s+or\s+|\s+and\s+|\

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

示例1

用户输入

ThiS or That or That one
将其替换为

[fieldName] like 'ThiS%' OR [fieldName] like 'That%' or [fieldName] like 'That one%'
我需要使用javascript替换函数

使用捕获组执行此操作:

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]+?)
    匹配单词/空格(非贪婪)。->第一组
  • (\s+或\s+|\s+和\s+|\s*$)
    匹配
    或字符串末尾的可选空格。->第2组
  • 整个模式匹配单词后跟
    /
    或字符串末尾
更新

如果要转义特殊字符:

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 %'"
请注意,包含冲突的
标记的关键字或搜索短语可用于代码注入,包含反斜杠的搜索词(至少)也可用于代码注入。这两个字符将提前从输入中删除

另外,我添加了一个
/I
标志,因为我认为输入应该不区分大小写。有些用户可能键入或,有些则键入或

像这样调用函数

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

生成以下内容:
[fieldName]类似于'this%'或[fieldName]类似于'That%'和[fieldName]类似于'That one%'

还有另一个带有regexp的变体

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

有没有可能在不拆分的情况下进行操作,以及如何处理和?OP说,用户可以输入一个OR或**和**分隔的关键字
该代码生成的“[fieldName]类似于‘ThiS%”或“[fieldName]类似于‘ThiS%”和[fieldName]”不像答案中的最后一句话。错误:
[fieldName]类似于‘ThiS%”或[fieldName]类似于‘ThiS%”和[fieldName]比如“那一个%”
OP指定用户输入的小写字母“或”。添加
i
标志是你的主意。OP没有具体说明这一点。如果你给我添加一个
/i
标志,你就会得到你所得到的。你需要或/和在输出中是大写,在输入中是小写,还是这很重要?为什么你只允许
\w\s
作为可能的搜索词?@JosephMyers匹配多个词。但是如果有人想搜索“兼职”呢?您的代码将只包含“时间”作为搜索词,因为与
\w
匹配的字符列表中不包含连字符(下划线是,但不是连字符)。@JosephMyers,然后将
[\w\s]
替换为
[-\w\s]
。然而,连字符只是一个例子。
"ThiS or That or That one".replace(/(.+?)((?:or|and)(.+?))|(.+)/gi, 
         function(a,b,c){
             return '[fieldName] like \''+(b||a).trim()+'%\' ' + (c||'');
         })