Regex 如果字符串包含某个字符串,如何使用正则表达式忽略这些字符串

Regex 如果字符串包含某个字符串,如何使用正则表达式忽略这些字符串,regex,bash,text,Regex,Bash,Text,我正在尝试使用正则表达式扫描一些日志文件。特别是,我希望挑选出符合此格式的行: IP地址或随机数“禁止”,例如“111.111.111.111禁止”或“0320932禁止”,等等 只能有两组字符(数字/IP地址和“禁止”。单词之间或之前可能有多个空格),字符串也不应包含“客户端”、“私人”或“请求”。在大多数情况下,我只是对如何检测字符组和避免包含这些单词的字符串感到困惑 感谢您可能提供的任何帮助以下内容将起作用: \s*\d\d\d\.\d\d\d\.\d\d\d\.\d\d\d\s*bann

我正在尝试使用正则表达式扫描一些日志文件。特别是,我希望挑选出符合此格式的行:

IP地址或随机数“禁止”,例如“111.111.111.111禁止”或“0320932禁止”,等等

只能有两组字符(数字/IP地址和“禁止”。单词之间或之前可能有多个空格),字符串也不应包含“客户端”、“私人”或“请求”。在大多数情况下,我只是对如何检测字符组和避免包含这些单词的字符串感到困惑


感谢您可能提供的任何帮助

以下内容将起作用:

\s*\d\d\d\.\d\d\d\.\d\d\d\.\d\d\d\s*banned\s*

以下工作将起作用:

\s*\d\d\d\.\d\d\d\.\d\d\d\.\d\d\d\s*banned\s*

我假设在以下输入数据中,应该删除第1行和第3行:

111.111.111.111 banned. 2.2.2.2 wibble 0320932 banned 1434324 wobble
此正则表达式匹配1个或多个数字和句点,后跟1个或多个空格,后跟单词“禁止”。将
-v
传递给grep将导致它显示所有与正则表达式不匹配的行。将
-i
添加到
grep
命令中,使其不区分大小写。

我假设在以下输入数据中应删除第1行和第3行:

111.111.111.111 banned. 2.2.2.2 wibble 0320932 banned 1434324 wobble 此正则表达式匹配1个或多个数字和句点,后跟1个或多个空格,后跟单词“禁止”。将
-v
传递给grep将导致它显示所有与正则表达式不匹配的行。将
-i
添加到
grep
命令中,使其不区分大小写。

尝试此RegExp

String regex = "\\d+.\\d+.\\d+.\\d+ banned.";
在这里,您可以过滤这两种字符串

示例:

public static void main(String[] args) {
    System.out.println("start");
    String src = "657 hi tis is 111.111.111.111 banned. 57 happy i9";
    //String src = "87 working is 0320932 banned. Its ending str 08";
    String regex = "\\d+.\\d+.\\d+.\\d+ banned.";

    Pattern pattern = Pattern.compile(regex);
    Matcher matcher = pattern.matcher(src);

    while(matcher.find()){
        System.out.println(matcher.start() + " : " + matcher.group());
    }
}
如果它不适合您,请告诉我。

试试这个RegExp

String regex = "\\d+.\\d+.\\d+.\\d+ banned.";
在这里,您可以过滤这两种字符串

示例:

public static void main(String[] args) {
    System.out.println("start");
    String src = "657 hi tis is 111.111.111.111 banned. 57 happy i9";
    //String src = "87 working is 0320932 banned. Its ending str 08";
    String regex = "\\d+.\\d+.\\d+.\\d+ banned.";

    Pattern pattern = Pattern.compile(regex);
    Matcher matcher = pattern.matcher(src);

    while(matcher.find()){
        System.out.println(matcher.start() + " : " + matcher.group());
    }
}

如果它不适合您,请告诉我。

您想要一个否定匹配,如下所示:

/^((?!([\d.\s]+banned\.)).)*$/
在行动中看到它:


注意您的示例显示了
禁用后的句点。如果不需要,请从表达式中删除
\.

您需要一个否定匹配,如下所示:

/^((?!([\d.\s]+banned\.)).)*$/
egrep -v '^ *[0-9]+((\.[0-9]+){3})? +banned\.$'
在行动中看到它:

注意您的示例显示了
禁用后的句点。如果不需要,请从表达式中删除
\.

egrep -v '^ *[0-9]+((\.[0-9]+){3})? +banned\.$'
  • 允许在行首使用可选的前导空格
  • 必须后跟全数字序列或类似IP的地址
  • 必须后跟至少一个空格
  • 行必须以“禁止”结尾
  • 最后,
    -v
    选项确保只返回与正则表达式不匹配的行
有了这些约束条件,您就不必担心排除诸如“client”之类的附加词

  • 允许在行首使用可选的前导空格
  • 必须后跟全数字序列或类似IP的地址
  • 必须后跟至少一个空格
  • 行必须以“禁止”结尾
  • 最后,
    -v
    选项确保只返回与正则表达式不匹配的行
有了这些约束条件,您就不必担心排除诸如“client”之类的附加词

试图匹配IP地址或随机数“禁止”。

这个
egrep
应该适合您:

egrep '(([0-9]{1,3}\.){3}[0-9]{1,3}|[0-9]+) +banned' logfile
试图匹配IP地址或随机数“禁止”。

这个
egrep
应该适合您:

egrep '(([0-9]{1,3}\.){3}[0-9]{1,3}|[0-9]+) +banned' logfile

此答案有太多问题,无法在评论中列出所有问题。你真的应该在发布解决方案之前测试它们。这个答案有太多问题,无法在评论中列出它们。在发布解决方案之前,您确实应该测试它们。