全球主机交流论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

CeraNetworks网络延迟测速工具IP归属甄别会员请立即修改密码
查看: 656|回复: 20

[疑问] 【已解决】大佬们,求个简单匹配正则表达式【感谢大佬】

[复制链接]
发表于 2024-2-26 11:56:27 | 显示全部楼层 |阅读模式
本帖最后由 whoareyou 于 2024-2-26 14:18 编辑

【已解决】最后采用了json解析,然后循环判断遍历,各位大佬都说用json解析好,感谢各位大佬

假如有一段文本:
{"result":[{"id":"1111111","ne_id":"aaaaaaaaa","name":"a.com"},{"id":"22222222","ne_id":"bbbbbbbbbb","name":"b.com"},{"id":"33333333","ne_id":"cccccccccc","name":"c.com"}]

要提取【b.com这段中的id字段】,也就是2222222

正则表达式该怎么写,不懂正则表达式,大佬指点下。

自己写的
("id").*(?="name":"b.com")
自己写的这个的问题是:把前面整段也匹配进去了,只想【提取b.com这段中的id字段】

谷歌搜索了下有向前匹配等知识,奈何没学过这方面的,只能来求助了
发表于 2024-2-26 13:26:57 | 显示全部楼层
本帖最后由 Twitter 于 2024-2-26 13:29 编辑

正则表达式:\{"id":"(\d+)","ne_id":"([^"]*?)","name":"b\.com"\}
如匹配结果赋值数组$matches,则$matches[1] 是id字段值,$matches[2] 是ne_id字段值。

点评

牛皮,6666,这个可以用  发表于 2024-2-26 14:20
发表于 2024-2-26 11:57:34 | 显示全部楼层
最佳方案不是解析json 后拿值吗,正则在这儿不是个好方案

点评

有道理,解析后确实好弄了,但遇到几次这种匹配了,所以想求个表表达式  发表于 2024-2-26 11:58
发表于 2024-2-26 11:58:18 | 显示全部楼层
有json不用。。。
发表于 2024-2-26 11:59:39 | 显示全部楼层
而且id里面是纯数字为什么不用数字匹配

点评

嗯,我不懂,所以来求助,主要是匹配包含向前查找,大佬出手吧,坐等学习  发表于 2024-2-26 12:00
发表于 2024-2-26 12:12:32 | 显示全部楼层
你可以使用以下的正则表达式来匹配你需要的内容:
  1. "ne_id":"bbbbbbbbbb","name":"b\.com","id":"(.*?)"
复制代码

这个正则表达式会匹配到 "ne_id":"bbbbbbbbbb","name":"b.com","id":" 这段文本,然后使用 (.*?) 来捕获 id 的值。这里的 (.*?) 是一个非贪婪匹配,它会尽可能少的匹配字符。

然而,这个正则表达式假设 id 字段总是在 name 字段之后。如果字段的顺序可能会改变,你可能需要使用一个更复杂的正则表达式,或者使用一个JSON解析器来提取你需要的信息。

注意:在正则表达式中,. 是一个特殊字符,它匹配任何字符(除了换行符)。如果你想匹配一个实际的 . 字符,你需要使用 \. 来转义它。
发表于 2024-2-26 12:30:08 | 显示全部楼层
本帖最后由 buggysoul 于 2024-2-26 12:43 编辑

安装jq, 用以下bash命令

  1. foo='{"result":[{"id":"1111111","ne_id":"aaaaaaaaa","name":"a.com"},{"id":"22222222","ne_id":"bbbbbbbbbb","name":"b.com"},{"id":"33333333","ne_id":"cccccccccc","name":"c.com"}]}'

  2. echo "$foo" | jq -r '.result[] | select(.name|test("b.com")) | .id'
复制代码

点评

感谢  发表于 2024-2-26 12:39
发表于 2024-2-26 12:42:12 | 显示全部楼层
buggysoul 发表于 2024-2-26 12:30
安装jq, 用以下bash命令

打错了一个单引号,已更正,测试正常。

安装jq,比如debian系统,apt install jq
发表于 2024-2-26 12:44:40 | 显示全部楼层


你可以使用正则表达式的正向预查(positive lookahead)来匹配特定条件之后的内容,而不包括这个条件本身。下面是一个匹配你所需内容的正则表达式:

```
"id":"(\d+)".*(?="name":"b\.com")
```

这个表达式会匹配在 `"name":"b.com"` 之前的 `"id"` 字段,并且只捕获括号内的数字部分。

解释一下:
- `"id":"(\d+)"`: 匹配 `"id":"` 后面跟着一系列数字的部分,并且将这一系列数字作为第一个捕获组。
- `.*`: 匹配任意数量的字符(除了换行符),这样我们可以跳过中间的其他内容。
- `(?="name":"b\.com")`: 这是正向预查,表示在匹配到 `"name":"b.com"` 之前的位置。这个部分不会被包含在匹配结果中。

你可以在你的代码中使用这个正则表达式来提取你需要的内容。
发表于 2024-2-26 13:01:30 | 显示全部楼层
用jq来处理确实简单,jq也是跨平台的随便用,命令懒得记直接稳gpt就行
发表于 2024-2-26 13:14:59 来自手机 | 显示全部楼层
不要用正则处理json,不然你会死得很惨
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|全球主机交流论坛

GMT+8, 2024-5-3 10:11 , Processed in 0.067386 second(s), 10 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表