我正在尝试学习一些关于正则表达式的知识。
这是我要匹配的内容:
/parent/child
/parent/child?
/parent/child?firstparam=abc123
/parent/child?secondparam=def456
/parent/child?firstparam=abc123&secondparam=def456
/parent/child?secondparam=def456&firstparam=abc123
/parent/child?thirdparam=ghi789&secondparam=def456&firstparam=abc123
/parent/child?secondparam=def456&firstparam=abc123&thirdparam=ghi789
/parent/child?thirdparam=ghi789
/parent/child/
/parent/child/?
/parent/child/?firstparam=abc123
/parent/child/?secondparam=def456
/parent/child/?firstparam=abc123&secondparam=def456
/parent/child/?secondparam=def456&firstparam=abc123
/parent/child/?thirdparam=ghi789&secondparam=def456&firstparam=abc123
/parent/child/?secondparam=def456&firstparam=abc123&thirdparam=ghi789
/parent/child/?thirdparam=ghi789
我的表达应该“抓住” abc123和def456。
现在只是一个关于我不会匹配的示例(“问号”丢失):
/parent/child/firstparam=abc123&secondparam=def456
好吧,我构建了以下表达式:
^(?:/parent/child){1}(?:^(?:/\?|\?)+(?:firstparam=([^&]*)|secondparam=([^&]*)|[^&]*)?)?
但这不起作用。
你能帮我理解我做错了什么吗?
提前致谢。
更新 1
好的,我做了其他测试。我正在尝试使用以下内容修复以前的版本:
/parent/child(?:(?:\?|/\?)+(?:firstparam=([^&]*)|secondparam=([^&]*)|[^&]*)?)?$
让我解释一下我的想法:
必须以 /parent/child 开头:
/parent/child
以下组是可选的
(?: ... )?
前一个可选组必须以 ? 或者 /?
(?:\?|/\?)+
可选参数(如果指定的参数是查询字符串的一部分,我会获取值)
(?:firstparam=([^&]*)|secondparam=([^&]*)|[^&]*)?
行结束
$
有什么建议吗?
更新 2
我的解决方案必须仅基于正则表达式。举个例子,我之前写过以下一个:
/parent/child(?:[?&/]*(?:firstparam=([^&]*)|secondparam=([^&]*)|[^&]*))*$
这很好用。但它也匹配以下输入:
/parent/child/firstparam=abc123&secondparam=def456
我如何修改表达式以不匹配先前的字符串?