1
keepeye 2021-06-30 16:15:09 +08:00
可能匹配不出来,只能把 ret 取出来 split
|
2
IgniteWhite 2021-06-30 16:19:40 +08:00
同不会写。我的感觉是这种 pattern 是非正则的,如果让我去做我会把 ret 里的内容用正则提出来,再用一个 csv parser 或者一个正则包里的 split 函数得到数值
|
3
woodensail 2021-06-30 16:23:00 +08:00
一次正则理论上可以,不过要用断言判断当前数字后面没有 ret 出现,而且老实说通用性不强,所以我倾向于两次正则
str.match(/ret[^[]+\[([^[]+)\]/)[1].match(/[\d\.]+/g) |
4
InDom 2021-06-30 16:27:20 +08:00
正则不是万能的,另外不要写过于复杂的正则,这玩意写不好性能非常差!!!
非要凑在一个里面实现,可能代码量少了,但执行时间会 toooooooooooo looooooooooog |
5
woodensail 2021-06-30 16:29:32 +08:00
更正一下,第一个正则里面匹配数字内容的部分应该改成排除右括号。虽然左括号也没错,但是确实右括号更合理。
str.match(/ret[^[]+\[([^\]]+)/)[1].match(/[\d\.]+/g) |
6
keepeye 2021-06-30 16:33:28 +08:00
@woodensail 能一次匹配出结果吗 我想学习下
|
7
imn1 2021-06-30 16:35:31 +08:00
这个正则不难,问题的点不在这里,而是正则输出的是 str 类型,而 json 表示的是 int 类型,除非只是显示用途,不然还有一个转换步骤,那还不如直接 json 解
莫不是一个 GB 级的 json ? |
8
woodensail 2021-06-30 16:40:03 +08:00
@keepeye str.match(/[\d\.]+(?!.*ret)/g)
用零宽断言,匹配数字同时要求数字后面不会出现 ret 字符. 缺点 1: 性能相比两次法差了很多。 缺点 2: 如果字段顺序变了或者 ret 字段后面又追加了其他字段就不行了。 |
9
lujjjh 2021-06-30 16:53:44 +08:00 1
str.match(/(?<="ret":\[[^\]]*)[^,\]]+/g)
抛开 lookbehind assertion 的兼容性问题,这么写也是不够准确的,要看你这个“类似 json 的字符串”具体格式是什么样 |
10
keepeye 2021-06-30 17:05:27 +08:00
@woodensail 是的,实际情况可不能保证说 ret 是最后一个字段,map 是没有顺序的
|
11
Jwyt OP |
12
Jwyt OP @woodensail 是的,ret 后面的内容我没复制,不过 ret 里的内容确实匹配到了
|
14
wjfz 2021-06-30 18:21:22 +08:00 1
给两头各加一个花括号,然后 json decode
|