我有一个包含大量数据的大文件,但基本上我想要做的只是抓取部分内容,让我解释一下我感兴趣的部分:
(想象“x”作为IP地址)
(想象“?”作为任何字母数字字符/ w任何长度)
(想象“MD5”作为MD5哈希)
(实际 - 不是字面上的文本文件)
'xxx.xxx.xxx.xxx' xxxxxxxxxx '?' '?' 'MD5'
现在我的询问如下:我如何确定行
'xxx.xxx.xxx.xxx'
在文件开头的任何地方然后自动写入另一个文件'?'条目和找到的每个IP地址实例的“MD5”条目。
所以简而言之,程序应该从文件的开头开始,读取内容,如果它达到了IP地址(Regex: '\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b'
对我来说很好),跳过下面的一行,然后开始复制其他数据到另一个文件,直到它到达MD5条目(Regex: '[a-f0-9]{32}'
对我来说很好),然后从那一点再次迭代,依此类推寻找另一个IP地址实例等等它应该一直这样做,直到它到达文件的末尾。
我正在尝试自己这样做,但我甚至不知道从哪里开始,或根本不知道这样做的方法。
答案 0 :(得分:0)
您可以使用以下内容来匹配您要查找的内容..并将其复制到所需的位置/文件:
('\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b')(\s*.+\s*)([\s\S]*?)('\b[a-f0-9]{32}\b')
并提取$1$3$4
请参阅DEMO
代码:
String regex = "('\\b\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\b')(\\s*.+\\s*)([\\s\\S]*?)('\\b[a-f0-9]{32}\\b')";
Pattern pattern = Pattern.compile(regex);
Matcher m = pattern.matcher(myString);
while (m.find()) {
System.out.println("end(): " + m.group(1));
//System.out.println("end(): " + m.group(2));
System.out.println("end(): " + m.group(3));
System.out.println("end(): " + m.group(4));
}
答案 1 :(得分:0)
鉴于你的文件是机器生成的,并且整体模式非常具体,我认为不必过分具体使用IP地址。
在模式的其余部分(*)的上下文中,将其匹配为“单引号中的一串数字和点”可能就足够了。
这是一个表达式,将您的整个要求与named groups匹配:
^'(?<IP>[\d.]+)'\s+
^(?<ID>\w*)\s+
^'(?<line1>\w*)'\s+
^'(?<line2>\w*)'\s+
^'(?<MD5>[A-Fa-f0-9]{32})'
将其与Multiline
和IgnorePatternWhitespace
regex options一起使用(后者意味着您可以保留正则表达式布局以提高可读性。)
(*)此外,在无数的例子中,IP地址的正则表达式模式实际上是无处不在的。当然,如果您认为有必要,可以使用比'[\d.]+'
更复杂的东西。
答案 2 :(得分:-1)
我已经在Java中尝试过这个。
公共类TestRegex {
/**
* @param args
*/
public static void main(String[] args)
{
String input = "assasasa 123.234.223.223 333 aad sddsf 343sdd sds23343 ssdfs33344 MD5=aas jjsjjdjd 143.234.223.223 333 aad sddsf 343sdd sds23343 ssdfs33344 MD5=asas";
String regexPattern = "(\\b[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\b).*?([A-Z a-z]+[0-9]+=.*?\\s)";
Matcher m = null;
Pattern pattern = Pattern.compile(regexPattern);
m = pattern.matcher(input);
// System.out.println(matcher.toString());
while (m.find()) {
System.out.println("start(): " + m.start());
System.out.println("end(): " + m.end());
System.out.println("end(): " + m.toString());
System.out.println("end(): " + m.group(1));
System.out.println("end(): " + m.group(2));
}
}
}