假设有一段文字
aaa.bbb.ccc.xxx(ddd.fffssss.eeee)
所有字符都是不等长的单词..需要做的是.提取出如下格式内容
xxx(ddd.fffssss.eeee)
提取出 . 号到 ( 号 和 ()号内 的文字..
这样的正则怎么写啊????
1
gwy15 2020-10-31 13:25:39 +08:00
\.(\w+\(.+\))
|
2
Fechin 2020-10-31 13:28:59 +08:00
(?<=\.)[^\.]+\([^)]+\)
|
3
llsquaer OP @gwy15 十分感谢啊. 为什么把 \w+ 改为 .+ 就变成了从开始位置的 . 开始了呢? 之前一直用 . 代表任意字符....所以之前一直没匹配上..
|
4
natsukage 2020-10-31 14:58:07 +08:00 2
@llsquaer #3 因为正则表达式引擎在匹配字符串和表达式时,是从前向后逐个扫描字符串中的字符,并判断是否与表达式符合的。 .bbb.ccc.xxx 和 .xxx 虽然都可以匹配 .+,但是正则表达式扫描的时候,从 .bbb 就已经开始能够正常匹配,一直持续到后面的整个 .bbb.ccc.xxx(ddd.fffssss.eeee) 结束匹配完成。虽然.ccc.xxx(ddd.fffssss.eeee)和.xxx(ddd.fffssss.eeee)也能完成匹配,但是因为.bbb.ccc.xxx(ddd.fffssss.eeee)是先来的,所以正则表达式会娶先来的这个作为最终结果。
如果想要解决这个问题,要么就是想办法让.bbb.ccc.xxx 和.ccc.xxx 不满足匹配,1 楼的解法就是这么做的,通过 \w 取代 . ,这样.xxx 就是第一个满足匹配的前缀了,因此能够正常匹配到你想要的结果。 要么就是提前把前面的部分( aaa.bbb.ccc.)全部用非捕获组匹配掉,然后在剩下的部分里匹配你想要匹配的内容,例如(?:.+\.)(?<match>.+?\([^)]+\)) |
5
dorothyREN 2020-10-31 19:04:29 +08:00
grep -o "[a-zA-Z]*(.*)"
|
6
dorothyREN 2020-10-31 19:04:56 +08:00
```
[root@db ~]# grep -o "[a-zA-Z]*(.*)" a xxx(ddd.fffssss.eeee) [root@db ~]# ``` |
7
dorothyREN 2020-10-31 19:32:23 +08:00
re.search(r"\.[^.]*\(.*\)", a)
|
8
huyangabc 2020-10-31 20:36:16 +08:00
\.(\w+\(.*\))
|
9
llsquaer OP |