文本输入

时间:2016-05-18 12:04:32

标签: regex

我应该在文本输入中强制执行某种搜索语法,在看了几个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 =值,以使字符串有效。

有人理解这个问题吗? :)

1 个答案:

答案 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?以下是一个示例解决方案:

&#13;
&#13;
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;
&#13;
&#13;