请教一个正则

2019-08-20 09:55:52 +08:00
 Martin9

字符串如下: _search=false&nd;=1566206479316&rows;=50&page;=2&sidx;=&sord;=desc&businessType;=&containerTypeId;=&operStatus;=&dispatchStatus;=&portId;=&customerId;=&billNo;=&orderNo;=&containerNo;=&customerOrderNo;=&yhNO;=&storageYardId;=&createBy;=&makeboxBeginDate;=2019-08-01&makeboxEndDate;=2019-08-19&dispatchGroupId;=&cityCode;=&salesmanid;=&relateAddrAddress;=

target: _search=false&
nd=1566206479316&
rows=50&
page=2
sidx=&
sord=desc&
businessType=&
makeboxBeginDate=2019-08-01&
makeboxEndDate=2019-08-19&

难点是中间有两个日期所以写的很费劲。
目前在用的:
(\w+)=(\w*[-]*\w+[-]*\w+)&

这个正则问题是 page=2 匹不到。page=10,11,12 两位数就可以
不太懂是什么问题.

3252 次点击
所在节点    正则表达式
10 条回复
a494836960
2019-08-20 10:10:40 +08:00
js: replace(/(.*?);?=(.*?)&?/g,'$1=$2\n')
a494836960
2019-08-20 10:12:55 +08:00
另外你的正则 (\w*[-]*\w+[-]*\w+) 这段有两个 \w+ 所以匹配结果最少要 两位数
rrfeng
2019-08-20 10:13:30 +08:00
看着这么整齐不如直接 split 再进一步处理。
Martin9
2019-08-20 10:18:13 +08:00
@rrfeng 是一个基类,很多请求都是要通过这个请求,不好改用 split
Martin9
2019-08-20 10:23:26 +08:00
@a494836960 thx。我试了下但是效果是这样
false&nd=
1566206479316&rows=
50&page=
2&sidx=&
有点岔开了
xenme
2019-08-20 10:30:24 +08:00
a494836960
2019-08-20 10:30:27 +08:00
/(.*?);?=(.*?)&/g 这样试试。。
Martin9
2019-08-20 10:39:04 +08:00
@xenme @a494836960 谢谢已发铜币
imdong
2019-08-20 10:53:30 +08:00
(?:^|\&)([^;=]+);?=([^&]+)?(?=$|\&)

https://regex101.com/r/vzBBz4/3

最少匹配,\w .* 这样的写法会计算次数太多。
这种匹配广泛的我建议用 [^] 排除法。
首末用了两次断言,
autoxbc
2019-08-20 12:08:25 +08:00
如果你的项目是 js,可以考虑用 URI.js

每次用正则去匹配结构化的数据,就等于重新写了一遍这种数据结构的解析器
我们应该重新写解析器吗?不,应该用别人已经写好的

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/593387

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX