正则表达式:从查询字符串中的逗号分隔列表中删除确切的数字

时间:2013-10-14 15:19:28

标签: regex query-string

我在查询字符串中将逗号分隔的数字列表作为值传递。例如,我有以下查询字符串:

?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 =”)

3 个答案:

答案 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个。

现场演示:http://www.rubular.com/r/2tp0HiYEaY

答案 2 :(得分:0)

我不确定您的要求,此正则表达式\bcat=(?:\d+,)*(8(?!\d),?)将在组号 1 中捕获数字8,(如果存在,则为昏迷)(您可以通过变量编号更改它)。

您可以在此处使用不同的输入进行测试:http://regex101.com/r/uM0bS7

它将匹配:

  • 视图=列表&安培;猫= 3,1,8,18&安培;排序= ASC
  • 视图=列表&安培;猫= 8,18&安培;排序= ASC
  • 视图=列表&安培;猫= 8&安培;排序= ASC
  • 视图=列表&安培;猫= 3,1,8,18,8&安培;排序= ASC
  • 视图=列表&安培;猫= 3,1,8&安培;排序= ASC

如果您的值8两次,它将与last匹配,如果您想匹配first,则只需要创建非捕获组{{1}像这样懒惰:(?:\d+,)*