Regex 如果字符串的结尾不是空的,则使用正则表达式来标记字符串的开头

Regex 如果字符串的结尾不是空的,则使用正则表达式来标记字符串的开头,regex,find,Regex,Find,我试图在配置中匹配以“deny”开头但不以“log”结尾的行。这似乎非常简单,但在我看过的众多论坛中,我都找不到我的解决方案。我的初学者心态让我尝试“^deny.*(!log$)”为什么这行不通?我的理解是,它会发现任何以“deny”开头的字符串,后跟0或更多数字的任何字符,其中行尾不是log。当给出一行,如deny this log,您的^deny.*(!log$)regex(我省略了示例问题中的空格)评估结果如下: ^deny匹配“deny” *表示“匹配任何字符的0个或多个”,因此它可以

我试图在配置中匹配以“deny”开头但不以“log”结尾的行。这似乎非常简单,但在我看过的众多论坛中,我都找不到我的解决方案。我的初学者心态让我尝试“^deny.*(!log$)”为什么这行不通?我的理解是,它会发现任何以“deny”开头的字符串,后跟0或更多数字的任何字符,其中行尾不是log。

当给出一行,如
deny this log
,您的
^deny.*(!log$)
regex(我省略了示例问题中的空格)评估结果如下:

  • ^deny
    匹配“deny”
  • *
    表示“匹配任何字符的0个或多个”,因此它可以匹配“此日志”
  • ^(?!log$)
    的意思是“确保下一个字符不是'log'然后是行尾。”在这种情况下,它们不是-它们只是行尾-因此正则表达式匹配
请尝试使用以下正则表达式:

^deny.*$(

在字符串的开头匹配deny,然后匹配到行的结尾,然后使用零宽度负查找后断言检查我们刚刚在行的结尾匹配的内容是否为'log'

尽管如此……

正则表达式不一定是完成这项工作的最佳工具

if (/^deny/ and not /log$/)
可能比更高级的正则表达式更清晰

if (/^deny.*$(?<!log)/)
如果(/^deny.*$(?
(?!log$)
是一个零宽度负前瞻断言,它意味着如果字符串中紧靠前的这一点是
log
和字符串的结尾,则不匹配,但是正则表达式中的
*
已经贪婪地消耗了字符串结尾的所有字符,因此
log
无法进行匹配h

如果您的正则表达式实现支持look behinds,那么您可以使用Josh Kelley的答案中的正则表达式,如果您使用的是javascript,那么您可以使用

/^deny(?:.{0,2}|.*(?!log)...)$/m
m
标志表示多行模式,它使
^
$
匹配每行的开始和结束,而不仅仅是字符串的开始和结束


请注意,三个
位于负数向前看之后,这样它就有空间匹配
log
(如果有)。包括这三个点意味着还需要添加
{0,2}
选项,以便
deny
后面有0到2个字符的字符串也会匹配。
(?:a | b)
表示a或b必须匹配的非捕获组。

老实说,我不确定。我正在使用Solarwinds Network Configuration Manager搜索配置,它在构建规则时支持正则表达式。我在他们的网站上搜索了所有内容,但找不到他们支持哪种风格的正则表达式。Solarwinds不喜欢那里的“will”有没有其他方法可以让正则表达式在不使用look behinds的情况下找到它?Solawinds工具似乎不喜欢“@Nathan Edwards”。我上面给出的正则表达式不包含lookback。只要删除分隔符
/
m
(如果不是javascript)。