我的REST API中有一个过滤器参数,看起来像这样:

owner='bob'                            // owner is bob
owner!'bob'                            // owner is not bob
owner.town='bel*'                      // owner's town starts with bel
owner.town='*bel*'                     // owner's town contains bel
owner.car='{ some json blob here}'     // owner's car equals some json blob
owner.car~                             // owner has a property named car


所以我想捕捉:


必需的字符串键
可以包含字母,数字,下划线,点,连字符或冒号
必需的运算符:+ |!|〜
可选值,可以以可选星号开头和/或结束
如果存在可选值,则必须用单引号将其引起来


我从以下内容开始,但是它没有返回我期望的结果:

String filter = "owner='bob'";
Pattern.compile("(\\w+?)(=|!|~)(*?)(\\w+?)(*?)");
final Matcher matcher = pattern.matcher(filter);

// Results
matcher.group(1)   // "owner"
matcher.group(2)   // "="
matcher.group(3)   // "\"
matcher.group(4)   // ""
matcher.group(5)   // "bob"
matcher.group(6)   // ""
matcher.group(7)   // "\"



我遇到的问题:


我认为(*?)不能正确捕获零或一个星号
调用matcher.group(anything)时传递“ owner〜”会导致失败


我很确定我还没有找到的正则表达式还有其他问题...

最佳答案

我将使用以下正则表达式:

^([\w.:-]+)([=!~])('.*')?$


它由三个连续的组组成,定义如下:


第一组与密钥匹配,该密钥是字母,数字,下划线,点,连字符或冒号的非空序列。
第二组匹配运算符,该运算符是“ =”,“!”之一或“〜”
第三个可选组与其余的匹配,这是当运算符不是“〜”时的属性值


您可以try it here

请注意,如果提及值可以以*开头或结尾,则暗示该值在其他位置不能包含*,则需要将第三个组更改为('\*?[^*]*\*?')

关于java - REST过滤器/搜索参数的Java正则表达式模式?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/60549842/

10-10 18:15
查看更多