通过正则表达式验证URL查询参数是否存在

时间:2016-02-23 17:20:11

标签: java regex

我想通过存在某些查询参数来验证URL。 例如,我想验证以/questions开头的URL字符串,前提是它具有查询字符串参数previousnext

我可以提出这个解决方案:/questions\?(previous|.+&previous)=.*&next=.* 如果previous参数放在next参数之前,则可以验证此网址。

你能告诉我是否有一种优雅的方式(无需制作或像((previous|.+&previous)=.*&next=.*|(next|.+&next)=.*&previous=.*))来编写这个正则表达式,以便它与previous和{{的顺序无关。 1}}参数,没有?

1 个答案:

答案 0 :(得分:1)

首先,您可以通过消除不必要的更改并将其替换为可选组来缩短当前正则表达式:

(previous|.+&previous) ===> (?:.+&)?previous=
                            ^^^^^^^^

(?:.+&)?previous=匹配一个或多个字符的一个或零个序列,而不是换行符后跟&(因此,字符串中可能存在或不存在),然后previous=

接下来,您可以强制执行两个需要previousnext参数的前瞻:

/questions[?](?=(?:.+&)?previous=)(?=(?:.+&)?next=)
             ^^^                 ^^^^             ^

请参阅regex demo

如果在字符串中的当前位置之后找不到它们的子模式,则这些(?=...)构造(正向前瞻)会失败。因此,前一个和下一个参数必须都在字符串中才能匹配字符串。 params的顺序并不重要,因为前瞻是在字符串中的相同位置执行的,它们不会消耗字符。