我的目标是从字符串中获取版本号,其中字符串可能包含任何内容。这是我的示例数据集:
Version 1.32.0.1
Version 1.32.0.1c
Version 1.32.1
Version 1.33.2e
Version 1.32
我尝试匹配with this regex (\d+\.\d+(?:\.\d+)?)(\w?)
,但是即使regex101.com提供了描述性细分,我似乎也无法弄清楚为什么它不匹配第四个十进制值
我对此正则表达式有什么误解,导致它与所有版本均不匹配?
答案 0 :(得分:1)
计算您有多少\d+
。您应该数3。因此您的正则表达式最多只能匹配3个数字,并且不可能匹配4个。
我不确定这是不是错字,或者您真的不明白,但是可以通过添加另一个组来解决:
(\d+\.\d+(?:\.\d+(?:\.\d+)?)?)(\w?)
这可以简化为:
\d+(?:\.\d+){1,3}(\w?)
如果要匹配任意多个大于1的数字,可以执行以下操作:
\d+(?:\.\d+)+(\w?)
\w
也将与_
相匹配。如果您不希望这样做,可以将其替换为[a-z]
。
答案 1 :(得分:1)
当前,您在非捕获组中使用了?
,该组将仅匹配第三个十进制值(即使存在第三和第四十进制值)。
一种解决方案是为您的非捕获组使用*
而不是?
中的non-capturing group
来匹配第三个以及第四个十进制值。
我在Scala中尝试过,它非常适合上面的输入:
val text: String = "Version 1.32.0.1c"
val pattern = """(\d+\.\d+(?:\.\d+)*)(\w?)""".r
val res: Regex.MatchIterator = pattern.findAllIn(text)
println(res.group(1)) // 1.32.0.1
println(res.group(2)) // c
答案 2 :(得分:0)
尝试此正则表达式,也许这是您想要实现的结果:
\w+[.](\w*[.]?)*
在文本块中:
Version 1_32.0.1
Version 1.32.0.1c
Version 1.32.1
Version 1.33.2e.
Version 1.32
Version e342
它仅匹配版本号,该版本号以任何字母数字字符(和下划线)开头,后跟一个点,并在循环中后跟零个或多个任何字母数字字符,并在行尾加点。
这是一个演示:regex