![]() | 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 ![]() str.match(/(?<="ret":\[[^\]]*)[^,\]]+/g) 抛开 lookbehind assertion 的兼容性问题,这么写也是不够准确的,要看你这个“类似 json 的字符串”具体格式是什么样 |
![]() | 10 keepeye 2021-06-30 17:05:27 +08:00 @woodensail 是的,实际情况可不能保证说 ret 是最后一个字段,map 是没有顺序的 |
![]() | 11 Dockerfile OP |
![]() | 12 Dockerfile OP @woodensail 是的,ret 后面的内容我没复制,不过 ret 里的内容确实匹配到了 |
![]() | 13 Dockerfile OP @lujjjh 感谢 确实可以。不过就像你说的,刚好这个老框架(php)不兼容模糊长度的断言。。看来还是得用其他办法了 |
![]() | 14 wjfz 2021-06-30 18:21:22 +08:00 ![]() 给两头各加一个花括号,然后 json decode |