我想通过存在某些查询参数来验证URL。
例如,我想验证以/questions
开头的URL字符串,前提是它具有查询字符串参数previous
和next
。
我可以提出这个解决方案:/questions\?(previous|.+&previous)=.*&next=.*
如果previous
参数放在next
参数之前,则可以验证此网址。
你能告诉我是否有一种优雅的方式(无需制作或像((previous|.+&previous)=.*&next=.*|(next|.+&next)=.*&previous=.*)
)来编写这个正则表达式,以便它与previous
和{{的顺序无关。 1}}参数,没有?
答案 0 :(得分:1)
首先,您可以通过消除不必要的更改并将其替换为可选组来缩短当前正则表达式:
(previous|.+&previous) ===> (?:.+&)?previous=
^^^^^^^^
(?:.+&)?previous=
匹配一个或多个字符的一个或零个序列,而不是换行符后跟&
(因此,字符串中可能存在或不存在),然后previous=
接下来,您可以强制执行两个需要previous
和next
参数的前瞻:
/questions[?](?=(?:.+&)?previous=)(?=(?:.+&)?next=)
^^^ ^^^^ ^
请参阅regex demo
如果在字符串中的当前位置之后找不到它们的子模式,则这些(?=...)
构造(正向前瞻)会失败。因此,前一个和下一个参数必须都在字符串中才能匹配字符串。 params的顺序并不重要,因为前瞻是在字符串中的相同位置执行的,它们不会消耗字符。