正则表达式无法解析版本

时间:2019-01-12 13:55:18

标签: regex

我的目标是从字符串中获取版本号,其中字符串可能包含任何内容。这是我的示例数据集:

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提供了描述性细分,我似乎也无法弄清楚为什么它不匹配第四个十进制值

我对此正则表达式有什么误解,导致它与所有版本均不匹配?

3 个答案:

答案 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