Regex 从用户代理提取应用程序名称

Regex 从用户代理提取应用程序名称,regex,Regex,我使用以下正则表达式从用户代理提取应用程序名称: ^[^\s/\[]+[\s/\[]\124;\ z 应用程序名称终止字符类由空格、反斜杠和[]组成。 它读取任何不是空格或/或[直到字符从开始到空格或/或]的字符[ 链接: 它在某些应用程序名称上失败,该名称之间有空格,并在空格之前提取字符 例如: 基于上述正则表达式: Pump Log/1300 CFNetwork/1121.2.2 Darwin/19.3.0 它抽取水泵 但基本事实是泵日志试试这个: ^([^\s/[]+(?:\s[\w]+

我使用以下正则表达式从用户代理提取应用程序名称:

^[^\s/\[]+[\s/\[]\124;\ z

应用程序名称终止字符类由空格、反斜杠和[]组成。 它读取任何不是空格或/或[直到字符从开始到空格或/或]的字符[

链接:

它在某些应用程序名称上失败,该名称之间有空格,并在空格之前提取字符

例如:

基于上述正则表达式:

Pump Log/1300 CFNetwork/1121.2.2 Darwin/19.3.0
它抽取水泵

但基本事实是泵日志

试试这个:

^([^\s/[]+(?:\s[\w]+/)?)
差不多了,在某些匹配中,最后一个斜杠应该被删除

原理很简单:在捕获所需字符串后,允许正则表达式捕获可选内容。在本例中,它是第一个空格后的第二个单词,如果在主匹配后可用,则结尾的?符号使第二部分类似于可选内容

UPD:这个更一般

^([^\s/[]+(?: [^/\d]+)?)
但这里有两点很有趣:

我不得不在正则表达式中加一个空格,\s在那里不起作用,我不知道它在代码中会是什么样子 它需要有一些规则,在空格之后可以做什么,我们需要在第二个可选部分停止。如果它是斜杠或括号,可以很好地工作,但是字符串像苹果iPhone10,4 iOS v13.3.1 Main/3.2.0或POF 12.51.1859;iPhone8,4;iOS 13.3.1;en_US;g=ON;p=ON;r=WWAN 56BA8A93-3748-4C5E-9D00-D811FCC4EBCE;很难o找到停止的地方。。。
除非我误读了您的需求,否则您的应用程序名称不包括第一个斜杠,只包括

^([^/]+)
或者,根据您在询问正则表达式问题时应始终指定的正则表达式引擎,您可以使用PCRE执行此操作:

^(.+?)/

您可以在字符类中指定允许的字符或使用替代字符|

您可以扩展它们以允许更多字符或允许的字符串

^([^\s/\[]+(?: (?:& )?[A-Z][a-z]*)*)(?:[\s/\[]|\Z)
^字符串开头 捕获组1 [^\s/\[]+匹配除空格字符以外的任何字符的1+倍,/或[ ?:匹配空格或使用\s+匹配1+个空格字符,这些空格字符也可以匹配换行符 ?:&[A-Z][A-Z]*可选匹配&并匹配大写字符A-Z,后跟可选小写字符A-Z *关闭非捕获组并可选地重复 封闭组1 ?:[\s/\[]\Z匹配空格/[或断言字符串的结尾
请注意,当您在regex101上选择Python时,可以使用\Z来声明字符串末尾的位置。

好的,如果您从正字符类^[^\n/\[]+[\s/\[]+[\s/\[].\Z中删除\s,它会工作得更好吗?查看额外/更长的匹配应该是什么?是否有以大写字符A-Z开头的可选单词?^[^\s/\[]+]:[A-Z]\w+*[\s/\[]|\z有些字符串是完全匹配的,没有/eg:在本例中,它是完全匹配的POF 12.51.1859;iPhone8,4;iOS 13.3.1;en_US;g=ON;p=ON;r=WWAN 56BA8A93-3748-4C5E-9D00-D811FCC4EBCE;它在这些字符串上失败,例如:Drive Safe&Save/3672 CFNetwork/1121.2.2 Darwin/19.3.0应该是Drive-Safe&Save,但它提供了驱动器,因为它是术语已删除\s请在答案中查看我的更新