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

时间:2013-12-21 05:00:14

标签: regex bash text

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

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

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

感谢您提供的任何帮助

6 个答案:

答案 0 :(得分:1)

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

111.111.111.111 banned.
2.2.2.2 wibble
0320932 banned
1434324 wobble

您可以使用此grep表达式删除它们:

$ grep -E -v "[0-9.]+ +banned" logfile.log 
2.2.2.2 wibble
1434324 wobble

$ 

此正则表达式匹配1个或多个数字和句点,后跟1个或多个空格,后跟单词“banned”。将-v传递给grep会使其显示与正则表达式匹配的所有行。将-i添加到grep命令以使其不区分大小写。

答案 1 :(得分:1)

试试这个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());
    }
}

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

答案 2 :(得分:1)

你想要一个否定的匹配,看起来像:

/^((?!([\d.\s]+banned\.)).)*$/

查看实际操作:http://regex101.com/r/bY7pK4

注意您的示例显示banned之后的一段时间。如果您不需要,请从表达式中删除\.

答案 3 :(得分:1)

egrep -v '^ *[0-9]+((\.[0-9]+){3})? +banned\.$'
  • 允许行首的可选前导空格。
  • 必须跟随全数字序列或类似IP的地址。
  • 必须至少跟一个空格。
  • 行必须以“禁止”结束。
  • 最后,-v选项确保只返回与正则表达式不匹配的行。

有了这些限制,您无需担心排除其他词语,例如“客户”。

答案 4 :(得分:1)

  

尝试匹配IP address or random number "banned."

egrep适合您:

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

答案 5 :(得分:-1)

以下内容可行:

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