正则表达式捕获&修复版本号

时间:2017-05-24 15:30:23

标签: regex pcre

我正在尝试创建正则表达式来提取版本号。由于提供这些版本字符串的源代码大多不可靠,我需要清理这些值。

版本是仅由一个点分隔的数字或一组数字。一旦连锁被打破,我就会停止捕捉并保留到目前为止捕获的内容。

测试用例:

Foo 1.2.3.4.5 bar --> Should capture 1.2.3.4.5
Foo 111111.2..3.4.5 bar --> Should capture 111111.2
Foo 10.. bar --> Should capture 10
1.2.3 aaa --> Should capture 1.2.3
aaa 1.2.3 --> Should capture 1.2.3
1.23 --> Should capture 1.23

我发现了一些例子,但没有一个与我的边缘案例相符(见上面概述的第三个案例)。

到目前为止,我有:

/(\d+(?:\.\d+)+)/i

但它并没有涵盖我的所有情况......我使用PHP(pcre)。

2 个答案:

答案 0 :(得分:4)

我会选择以下内容:

\d+(?:\.\d+)*

这匹配一个数字,后跟任意数量的[点和数字]。

与正则表达式的不同之处在于使用*可以捕获由单个数字组成的版本。

我还删除了可能没有用处的外部分组括号。

答案 1 :(得分:2)

解决方案1:

Regex demo

正则表达式: ^[^\d]+\s*\K(\d+(?:\.\d+)*)

  

1。 ^字符串的开头。

     

2。 [^\d]+\s*匹配除数字以外的所有内容spaces

     

3。 \K会重置比赛。

     

4。 (\d+(?:\.\d+)*)这将匹配digits,然后存在零个或多个.digits模式

解决方案2:

Regex demo

正则表达式: ^Foo\s*\K(\d+(?:\.\d+)*)

  

1。 ^字符串的开头。

     

2。 Foo\s*这将匹配Foospaces

     

3。 \K会重置比赛。

     

4。 (\d+(?:\.\d+)*)这将匹配digits,然后存在零个或多个.digits模式