如何使用正则表达式忽略包含特定子字符串的字符串?

时间:2009-02-09 22:55:11

标签: java regex regex-negation

如何使用负向lookbehind(或任何其他方法)正则表达式来忽略包含特定子字符串的字符串?

我已经读过两个以前的stackoverflow问题:
java-regexp-for-file-filtering
regex-to-match-against-something-that-is-not-a-specific-substring

他们几乎我想要的东西......我的问题是字符串不会以我想要忽略的结束。如果这样做,这不会是一个问题。

我有一种感觉这与lookarounds为零宽度并且在第二次通过字符串时匹配的事实有关... 但是,我对内部人员不太确定。

无论如何,如果有人愿意花时间解释它,我会非常感激。

以下是我想忽略的输入字符串示例:

192.168.1.10 - - [08 / Feb / 2009:16:33:54 -0800]“GET / FOO / BAR / HTTP / 1.1”200 2246

以下是我想保留以供进一步评估的输入字符串示例:

192.168.1.10 - - [08 / Feb / 2009:16:33:54 -0800]“GET /FOO/BAR/content.js HTTP / 1.1”200 2246

对我来说,关键是我想忽略文档根默认页面之后的任何HTTP GET。

以下是我的小测试工具和迄今为止我提出的最好的RegEx。

public static void main(String[] args){
String inString = "192.168.1.10 - - [08/Feb/2009:16:33:54 -0800] \"GET /FOO/BAR/ HTTP/1.1\" 200 2246";
//String inString = "192.168.1.10 - - [08/Feb/2009:16:33:54 -0800] \"GET /FOO/BAR/content.js HTTP/1.1\" 200 2246";
//String inString = "192.168.1.10 - - [08/Feb/2009:16:33:54 -0800] \"GET /FOO/BAR/content.js HTTP/"; // This works
//String inString = "192.168.1.10 - - [08/Feb/2009:16:33:54 -0800] \"GET /FOO/BAR/ HTTP/"; // This works
String inRegEx = "^.*(?:GET).*$(?<!.?/ HTTP/)";
try {
  Pattern pattern = Pattern.compile(inRegEx);

  Matcher matcher = pattern.matcher(inString);

  if (matcher.find()) {
    System.out.printf("I found the text \"%s\" starting at " +
"index %d and ending at index %d.%n",
matcher.group(), matcher.start(), matcher.end());
  } else {
    System.out.printf("No match found.%n");
  }
} catch (PatternSyntaxException pse) {
  System.out.println("Invalid RegEx: " + inRegEx);
  pse.printStackTrace();
}
}

4 个答案:

答案 0 :(得分:4)

您是否可以匹配任何不以/

结尾的路径
String inRegEx = "^.* \"GET (.*[^/]) HTTP/.*$";

这也可以使用否定后瞻

来完成
String inRegEx = "^.* \"GET (.+)(?<!/) HTTP/.*$";

此处,(?<!/)表示“前面的序列必须匹配/”。

答案 1 :(得分:1)

也许我在这里遗漏了一些东西,但你不能没有任何正则表达式而忽略任何事情,这是真的:

string.contains("/ HTTP")

因为文件路径永远不会以斜杠结束。

答案 2 :(得分:0)

我会用这样的东西:

"\"GET /FOO/BAR/[^ ]+ HTTP/1\.[01]\""

这匹配不仅仅是/FOO/BAR/的每条路径。

答案 3 :(得分:-1)

如果您正在编写Regex这个复杂的,我建议在StackOverflow之外构建一个资源库。