你会如何使用普通的表达忽视串包含特定子串?
-
22-08-2019 - |
题
我怎么去使用一个负回顾(或任何其他方法)经常表达的忽略串,其中包含一个具体的子串?
我读以前两个计算器问题:
java-regexp为文件过滤
regex到比赛-对-东西-是的-是的-不是-一个具体的子串
他们 近 我想要什么...我的问题是串不结束有什么我想到忽视。如果它做了这不会是一个问题。
我有一种感觉,这与事实上,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获得,会后文件根默认页。
以下是我的小测试工具和最佳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();
}
}
解决方案
你能只是匹配不与/
结束的任何路径
String inRegEx = "^.* \"GET (.*[^/]) HTTP/.*$";
这也可利用来完成负回顾后
String inRegEx = "^.* \"GET (.+)(?<!/) HTTP/.*$";
下面,(?<!/)
说 “在前述序列必须不的匹配/
”。
其他提示
也许我失去了一些东西,但不能你只是去,没有任何的正则表达式,而忽略任何事情上,这是正确的:
string.contains("/ HTTP")
由于文件路径决不会与斜线结束。
我会用这样的:
"\"GET /FOO/BAR/[^ ]+ HTTP/1\.[01]\""
这每一个不只是/FOO/BAR/
路径相匹配。
如果你正在写Regex这个复杂,我建议建立一个图书馆资源以外的计算器.
不隶属于 StackOverflow