1

我有一个看起来像下面的字符串

id=16&xxx&sid=3
xxx&sid=3&id=5
xxx&xxx&id=6
sid=5&xxxx

基本上,有id并且sid我想用正则表达式解析它们的值,但问题都以“id”结尾

我有以下正则表达式

ssid=(\d{1,})
id=(\d{1,})

我可以 id=(\d{1,})对它认为 ss(id)=xa 匹配的第二个表达式做些什么。考虑到我不知道表达式之前是什么,我能做些什么来解决这个问题?

只要前面没有ss

4

3 回答 3

2

/(?:^|[^s])id=(\d+)/将匹配,除非前面有一个 s

正则表达式的第一部分:(?:^|[^s])意思是“匹配字符串的开头或除 s 之外的任何内容”

你还会注意到我切换到了\d{1,}\d+因为他们做同样的事情

更新:

由于您要避免的不是“sid”,而是“ssid”,请改用它:

/(?:^|[^s])s?id=(\d+)/

这将匹配 sid,但不匹配 ssid,如果这是您需要的

于 2013-08-30T21:36:06.770 回答
1

由于这看起来像 URL 的查询参数列表,我假设它是一个。

我不认为单个正则表达式是最好的匹配解决方案。最干净和明显的解决方案是:

  • 拆分字符串&
  • 拆分每个部分=,创建一个地图
  • 在该地图中查找您需要的键

这样,您以后可以轻松地使用该字符串中的更多参数。它还有助于稍后阅读代码并直观地验证其正确性。

这通常扩展到 URL 处理。更好地将其解析为可读结构(无论您的语言是什么),并为各个部分使用访问函数。由于 URL 部分的正确转义和反转义并非易事,因此应该有一个小库。

于 2013-08-30T22:39:03.040 回答
1
   (?:[^s]|^)(?:s?id)=(\d*)?

正则表达式可视化

在 Debuggex 上实时编辑

于 2013-08-30T21:52:18.600 回答