求一个 go 正则表达式的写法

2022-05-05 18:02:42 +08:00
 yujianwjj

一个目录下有很多 .log 的文件

xx.log
xx.2022-04-01.log
xx.1.log

需要排除 .1.log 这样的文件。

由于 go 不支持 Negative look-ahead 。不能用 (?!

func TestRegex2(t *testing.T) {
	r, err := regexp.Compile(`.*([^.]\D)\.log$`)
	if err != nil {
		t.Fatal(err)
	}
	cases := []struct {
		dest  string
		match bool
	}{
		{"/afafa/a.log", true},
		{"/afafa/a_err.log", true},
		{"/afafa/a_.log", true},
		{"/afafa/a_3.log", true},          // 报错
		{"/afafa/a_3.abc.log", true},
		{"/afafa/a.1.log", false},
		{"/afafa/a.2022.log", true},       // 报错
		{"/afafa/a.2022-4-1.log", true},   // 报错
	}
	for i := range cases {
		t.Run(cases[i].dest, func(t *testing.T) {
			if r.MatchString(cases[i].dest) != cases[i].match {
				t.Errorf("match not correct")
			}
		})
	}
}

求告知正确的写法。

1974 次点击
所在节点    Go 编程语言
9 条回复
lozzow
2022-05-05 18:20:20 +08:00
哈哈哈能不能把字符串反转之后不匹配 gol.1.这样的文件呢😁
ch2
2022-05-05 18:35:48 +08:00
字符串反转一下就行了
AlisaDestiny
2022-05-05 18:37:12 +08:00
既然标准库不支持 Negative look-ahead 那就找个支持的开源库不就完事了。
https://github.com/dlclark/regexp2#compare-regexp-and-regexp2
AX5N
2022-05-05 18:59:07 +08:00
.*([^1]|\..{2,})\.log$
--------------------------
当然,用正则表达式来解决这个问题非常蠢,直接截取文件名最后 6 个字符,如果等于 [.1.log] 直接不匹配就行了,两行就能搞定。

if filename[-6:] == '.1.log':
continue
Dvel
2022-05-05 19:16:08 +08:00
这样不就行了吗:
strings.HasSuffix(filename, ".1.log")
darklights
2022-05-05 21:11:59 +08:00
换个思路。

如果只有 xx.log xx.2022-04-01.log 这两种形式,那就:
^[^.]+(?:\.\d{4}-\d{2}-\d{2})?\.log$

如果只需排除中间是纯数字,那就:
^[^.]+(?:\..*[^\d.]+.*)?\.log$

以上 ecmascript 正则,不懂 golang
ropon
2022-05-06 08:09:47 +08:00
logagent 采集目录打开的日志文件 lsof +d /path
eudore
2022-05-06 09:15:07 +08:00
`path/filepath.Match` 函数了解一下
cyjme
2022-05-06 10:42:58 +08:00
用一个支持 look-ahead 的库

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

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

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

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

© 2021 V2EX