0

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

?view=list&cat=1,8,18&sort=asc

现在我想从“cat”变量中删除“8”。到目前为止,我有这个,只匹配“cat”的值

(?<=cat=)([^&]*)

这会让我得到“1,8,18”。现在我只想选择确切的数字“8”,这可能吗?我知道将逗号分隔的列表转换为数组会更容易,但在这种特定情况下这是不可能的。

编辑:正则表达式只能匹配“cat”变量中的数字,并且必须以逗号分隔的列表或作为单个值工作。所以下面的测试字符串:

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

4

3 回答 3

1

没有后视:

(cat=(?:\b[^8]\d*\b)*?),?8(&)|8,

并替换为捕获组 1 和 2

现在针对您上面添加的示例进行测试,正则表达式替换返回:

?view=list&cat=1,18&sort=asc
?view=list&cat=&sort=asc
?view=list&cat=1,18&sort=asc&someOtherVar=8
于 2013-10-14T16:01:56.483 回答
0

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

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

它将匹配:

  • ?view=list&cat=3,1,8,18&sort=asc
  • ?view=list&cat=8,18&sort=asc
  • ?view=list&cat=8&sort=asc
  • ?view=list&cat=3,1,8,18,8&sort=asc
  • ?view=list&cat=3,1,8&sort=asc

如果你有8两次值,它将匹配last一个,如果你想匹配first一个,你只需要像这样使非捕获组变得(?:\d+,)*懒惰:\bcat=(?:\d+,)*?(8(?!\d),?)

于 2013-10-14T16:02:29.027 回答
0

我相信这个正则表达式:

(?<=cat=)(?:[^,]*,)*(8)(?:\W|$)

应该给你匹配组#1中的8个。

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

于 2013-10-14T15:22:23.170 回答