我正在编写一个正则表达式,以返回用于我们的监视系统的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)?
谢谢。
答案 0 :(得分:2)
您可能会考虑完全更改正则表达式,因此只有一个捕获组。
您要捕获的两个数字均以version=OpenSSH_
开头,中间带有一些可选字符。
因此,您可以这样做:
version=OpenSSH_\D*(\d\.\d)
无论哪种情况,哪个都会捕获正确的版本。优点是您不需要知道要使用哪个匹配组-返回值始终是第1组。
如果您想使用现有的变更表,也可以将其重构为只有一个捕获组:
(?:Windows_|\S+OpenSSH_)(\d.\d)
只需知道格式将具有更多的回溯功能,并且效率可能比第一种格式低10倍。
答案 1 :(得分:0)
答案 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)))