我在查询字符串中将逗号分隔的数字列表作为值传递。例如,我有以下查询字符串:
?view=list&cat=1,8,18&sort=asc
现在我想从“cat”变量中删除“8”。到目前为止,我有这个,只匹配“猫”的价值
(?<=cat=)([^&]*)
这会让我“1,8,18”。现在我只想选择确切的数字“8”,这可能吗?我知道将逗号分隔列表转换为数组会更容易,但在这种特殊情况下,这是不可能的。
编辑:正则表达式必须只匹配“cat”var中的数字,并且必须以逗号分隔列表或单个值工作。所以以下测试字符串:
?view=list&cat=1,8,18&sort=asc
?view=list&cat=8&sort=asc
?view=list&cat=1,8,18&sort=asc&someOtherVar=8
它们都必须只匹配单个数字“8”(不是最后8个,因为它之前没有“cat =”)
答案 0 :(得分:1)
没有后卫:
(cat=(?:\b[^8]\d*\b)*?),?8(&)|8,
并替换为捕获组1&amp; 2
现在针对上面添加的示例进行测试,正则表达式替换返回:
?view=list&cat=1,18&sort=asc
?view=list&cat=&sort=asc
?view=list&cat=1,18&sort=asc&someOtherVar=8
答案 1 :(得分:0)
我相信这个正则表达式:
(?<=cat=)(?:[^,]*,)*(8)(?:\W|$)
应该给你匹配的组#1中的8个。
答案 2 :(得分:0)
我不确定您的要求,此正则表达式\bcat=(?:\d+,)*(8(?!\d),?)
将在组号 1
中捕获数字8,
(如果存在,则为昏迷)(您可以通过变量编号更改它)。
您可以在此处使用不同的输入进行测试:http://regex101.com/r/uM0bS7
它将匹配:
如果您的值8
两次,它将与last
匹配,如果您想匹配first
,则只需要创建非捕获组{{1}像这样懒惰:(?:\d+,)*