我应该在文本输入中强制执行某种搜索语法,在看了几个RegEx视频和教程之后,我仍然难以为我的目的创建一个正则表达式。
表达式结构应该是这样的:
$earch://site.com?y=7, app=app1, wu>7, cnt<>8, url=http://kuku.com?adasd=343 , p=8
可以从自由文本搜索开始,该搜索可能包含除分隔符之外的任何字符,即,
。 (自由文本必须是第一个,字符串可能只是自由文本搜索)。
自由文本以逗号分隔的字段名称部分仅包含[a-z][A-Z]
,后跟运算符:(=|<|>|<>)
,后跟字段搜索值,可能只是,
。
(\s*)
。
必须出现自由文本部分或至少一个field =值,以使字符串有效。
有人理解这个问题吗? :)
答案 0 :(得分:0)
^[^,]*(?:,\s*[a-zA-Z]+(?:[=><]|<>)[^,]+)*$
? - Rawing谢谢,这似乎有效。你为什么使用非捕获组?
他之所以这样做很可能是因为他并没有假设要捕获这些群体(你没有指明这一点)。
另外 - 如果我用逗号开始字符串,它是有效的,而我 希望它无效(如果开头没有自由文本)。
这可以通过将第一个*
更改为+
来实现。即^[^,]+…
我正在使用javascript。我希望能够分隔每个key =值 对(包括可能的自由文本作为一组),并在其中 group我希望能够捕获key,operator和value 单独的实体(或组)
只有一个RegExp调用不可行,请参阅e。 G。 How to capture an arbitrary number of groups in JavaScript Regexp?以下是一个示例解决方案:
s = '$earch://site.com?y=7, app=app1, wu>7, cnt<>8, url=http://kuku.com?adasd=343 , p=8'
part = /,\s*([a-zA-Z]+)(<>|[=><])([^,]+)/
re = RegExp('^([^,]+)('+part.source+')*$')
freetext = re.exec(s)[1] // validate s and take free text as 1st capture group of re
if (freetext)
{ document.write('free text:', freetext, '<p>')
parts = RegExp(part.source, 'g')
m = s.slice(freetext.length).match(parts) // now get all key=value pairs into m[]
if (m)
{ field = []
for (i = 0; i < m.length; ++i)
{ f = m[i].match(part) // and now capture key, operator and value from m[i]
field[i] = { key:f[1], operator:f[2], value:f[3] }
for (property in field[i]) // display them
document.write(property, ':', field[i][property], '; ')
document.write('<p>')
}
document.write(field.length, ' key/value pairs total<p>')
}
}
&#13;