我创建了下面的代码来使用正则表达式获取日期,但它没有得到它:
package main
import (
"fmt"
"regexp"
)
func main() {
strings := []string{
"mid_monthly_2023_10_mac",
"mid_monthly_2023_11_mac",
"mid_monthly-20-04-end",
"mid_monthly-19-6-end",
}
pattern := `\b(?:\d{4}[-_]\d{1,2}[-_]\d{1,2}|\d{2}[-_]\d{1,2}[-_]\d{4})\b`
for _, str := range strings {
re := regexp.MustCompile(pattern)
matches := re.FindAllString(str, -1)
fmt.Println(matches)
}
}
字符串
matches不返回任何东西,任何建议。
2条答案
按热度按时间iaqfqrcu1#
在RegEx中,单词边界(
\b
)包括数字和下划线作为单词的一部分。你的例子经常包含下划线作为建议的边界,所以你需要寻找它而不是\b
快捷方式。您的RegEx是为3部分日期编写的,但您的示例字符串只有两部分。如果您希望所有四个字符串都匹配,则需要将第三部分设置为可选,或者将其完全从测试中删除。(您的请求中没有具体说明)
您的后两个示例没有4位数字,但目前您的两个RegEx测试都期望至少有一个4位数字。(您的请求中没有具体说明)
如果你要找的是两个部分,其中一个总是四位数:(只有前两个匹配)
[-_](\d{4}[-_]\d{1,2}|\d{1,2}[-_]\d{4})[_-]
个如果你要找两个部分,其中一个可以是四位数:(四个都匹配)
[-_](\d{4}[-_]\d{1,2}|\d{1,2}[-_]\d{4}|\d{1,2}[-_]\d{1,2})[_-]
u3r8eeie2#
代码中的正则表达式模式似乎是问题所在。它与您在字符串中提供的日期格式不匹配。我修改了正则表达式模式,它应该与字符串中的日期匹配:
字符串
修改后的模式
\b\d{4}[-_]\d{1,2}[-_]\d{1,2}\b|\b\d{2}[-_]\d{1,2}[-_]\d{2}\b
应匹配格式为“YYYY-MM-DD”或“YY-MM-DD”的日期,并以连字符或下划线分隔请尝试
用于下划线
型
此模式匹配格式为“YYYY_MM_DD”或“YY_MM_DD”的日期,并以下划线(_)分隔