在RegEx中使用AND运算符匹配短语中的两个单词?[重复]

lp0sw83n  于 2023-04-22  发布在  其他
关注(0)|答案(1)|浏览(132)

此问题已在此处有答案

Regex to match string containing two names in any order(9个回答)
8天前关闭
我的查询中有以下数据:
“Linux服务器”,“防火墙”
这两个实际上是标签,所以有多个主机只属于“Linux Server”组。如果我使用RegEx /.*Linux.*|.*Firewall.*/,它就像一个OR操作符,过滤Linux Server中的主机,也过滤Firewall组中的主机。
因此,您可以使用|(管道)来表示OR,但如何表示AND运算符呢?
我想匹配包含“Linux服务器”和“防火墙”的短语,没有特别的顺序。
我尝试使用"/.*Linux.*Firewall.*/,但它不起作用。这将在Grafana中用于过滤一些主机,如下图所示:

在上面的图片中,我尝试使用我之前说过的RegEx:"/.*Linux.*Firewall.*/ .没有工作。
我也在Grafana论坛上提出了一个问题:https://community.grafana.com/t/grafana-zabbix-query-two-hostgroups-using-regex/84018但没有得到回复。
而且,如果这还不够,我还在StackOveflow上搜索了多个问题,但没有一个解决了我的问题。
有人能帮我吗?在RegEx中编程真的很复杂,我需要这个帮助。
谢谢。

egdjgwm8

egdjgwm81#

正则表达式中没有直接的AND运算符,例如由|另一方面,肯定的先行Assert可以产生类似AND的行为。
您可以使用以下正则表达式来匹配以任意顺序包含“Linux Server”和“Firewall”的短语:

(?=.*Linux)(?=.*Firewall).+

此正则表达式的操作如下:

  • (?=.*Linux)是一个肯定的先行Assert,它确定单词“Linux”是否出现在输入字符串中的任何位置。“Linux”前面的.* 允许任何数量的字符(零或更多)出现在“Linux”之前。
  • (?=.*Firewall)是另一个肯定的先行Assert,用于测试输入字符串中的单词“Firewall”。“Firewall”前面的.* 允许在“Firewall”之前出现任意数量的字符(零个或更多)。
  • 找到“Linux”和“Firewall”后,.+匹配输入字符串中的一个或多个字符。

相关问题