如何使用负回顾后发表达式(或其他方法)来忽略包含特定子字符串的字符串?
我阅读了两个之前的stackoverflow问题: java-regexp-for-file-filtering regex-to-match-against-something-that-is-not-a-specific-substring 它们几乎是我想要的...我的问题是字符串不以我想要忽略的内容结尾。如果这样做,这将不是一个问题。
我觉得这与环视是零宽度有关,第二次通过字符串时会匹配到某些内容...但是,我对内部机制并不确定。
无论如何,如果有人愿意花时间解释一下,我将非常感慕。
以下是我想要忽略的输入字符串的示例:
192.168.1.10 - - [08/Feb/2009:16:33:54 -0800] "GET /FOO/BAR/ HTTP/1.1" 200 2246
我阅读了两个之前的stackoverflow问题: java-regexp-for-file-filtering regex-to-match-against-something-that-is-not-a-specific-substring 它们几乎是我想要的...我的问题是字符串不以我想要忽略的内容结尾。如果这样做,这将不是一个问题。
我觉得这与环视是零宽度有关,第二次通过字符串时会匹配到某些内容...但是,我对内部机制并不确定。
无论如何,如果有人愿意花时间解释一下,我将非常感慕。
以下是我想要忽略的输入字符串的示例:
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。
以下是我的小测试工具和我迄今为止想出的最佳正则表达式。
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();
}
}