Javascript 要替换或分隔列表的正则表达式
用户可以在输入框中输入或分隔的关键字进行搜索。 我需要将关键字替换为执行搜索所需的应用程序查询字符串 示例1 用户输入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+|\
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||'');
})