在正则表达式匹配中隔离组

时间:2018-07-04 19:20:01

标签: regex

我正在编写一个正则表达式,以返回用于我们的监视系统的Windows机器上安装的OpenSSH的版本号。我有两个字符串之一:

version=OpenSSH_for_Windows_7.7p1, LibreSSL 2.6.4
version=OpenSSH_7.1p1 Microsoft_Win32_port_with_VS Dec 22 2015, OpenSSL 1.0.2d 9 Jul 2015

当正则表达式为:

\S+Windows_(\d.\d)

然后7.7在组1中,监视系统将看到它。但是,当我尝试覆盖7.1字符串时,分组变得混乱。

(\S+Windows_(\d.\d)|\S+OpenSSH_(\d.\d))

如何修改该字符串以隔离组3和组1(分别用于7.1和7.7)?

谢谢。

4 个答案:

答案 0 :(得分:2)

您可能会考虑完全更改正则表达式,因此只有一个捕获组。

您要捕获的两个数字均以version=OpenSSH_开头,中间带有一些可选字符。

因此,您可以这样做:

version=OpenSSH_\D*(\d\.\d)

无论哪种情况,哪个都会捕获正确的版本。优点是您不需要知道要使用哪个匹配组-返回值始终是第1组。

Demo

如果您想使用现有的变更表,也可以将其重构为只有一个捕获组:

(?:Windows_|\S+OpenSSH_)(\d.\d)

Demo

只需知道格式将具有更多的回溯功能,并且效率可能比第一种格式低10倍。

答案 1 :(得分:0)

使用非捕获组:

(?:\S+Windows_(\d\.\d)|\S+OpenSSH_(\d\.\d))

Try it out.

答案 2 :(得分:0)

(?:(\S+Windows_)|(\S+OpenSSH_))(\d+\.\d+)

您可以像这样将组拆分,因为它总是位于同一组(在group3中)中,所以(?:)是一个非捕获组。 https://regex101.com/r/ZgtiYo/3

答案 3 :(得分:0)

如您所见,此问题有更多解决方案。您尝试过的正则表达式的有趣之处在于,它可以在集合内创建超出所需捕获组的内容。您可以使用一种特定的结构来解决此问题(如果支持):Branch Reset Groups

在所有选项之间共享在分支重置组内基本捕获的组,将其视为一种高级回溯,可以在其中重用组。

这是新的正则表达式:

((?|\S+OpenSSH_(\d\.\d)|\S+Windows_(\d\.\d)))