我正在尝试创建正则表达式来提取版本号。由于提供这些版本字符串的源代码大多不可靠,我需要清理这些值。
版本是仅由一个点分隔的数字或一组数字。一旦连锁被打破,我就会停止捕捉并保留到目前为止捕获的内容。
测试用例:
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)。
答案 0 :(得分:4)
我会选择以下内容:
\d+(?:\.\d+)*
这匹配一个数字,后跟任意数量的[点和数字]。
与正则表达式的不同之处在于使用*
可以捕获由单个数字组成的版本。
我还删除了可能没有用处的外部分组括号。
答案 1 :(得分:2)
解决方案1:
正则表达式: ^[^\d]+\s*\K(\d+(?:\.\d+)*)
1。
^
字符串的开头。2。
[^\d]+\s*
匹配除数字以外的所有内容spaces
3。
\K
会重置比赛。4。
(\d+(?:\.\d+)*)
这将匹配digits
,然后存在零个或多个.
和digits
模式
解决方案2:
正则表达式: ^Foo\s*\K(\d+(?:\.\d+)*)
1。
^
字符串的开头。2。
Foo\s*
这将匹配Foo
和spaces
3。
\K
会重置比赛。4。
(\d+(?:\.\d+)*)
这将匹配digits
,然后存在零个或多个.
和digits
模式