使用RegEx从大文件中提取文本
本文关键字:提取 取文本 文件 RegEx 使用 | 更新日期: 2023-09-27 17:54:05
我有一个大文件,里面有一堆数据,但本质上我想做的是只抓取其中的一部分,让我解释一下我感兴趣的部分:
(假设"x"是IP地址)
(想象"?"是任意长度的字母数字字符)
(假设"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地址的另一个实例,等等。它应该一直这样做,直到它到达文件的末尾。
我试着自己做这件事,但我甚至不知道从哪里开始,也不知道怎么做
您可以使用以下内容来匹配您正在查找的内容。并复制到所需的位置/文件:
(''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
看到演示代码:
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));
}
鉴于您的文件是机器生成的,并且总体模式非常具体,我认为没有必要过于具体地指定IP地址。
在模式(*)的其余部分上下文中,将其匹配为"一堆数字和单引号中的点"可能就足够了。
下面是一个表达式,它匹配了命名组的全部要求:
^'(?<IP>['d.]+)''s+
^(?<ID>'w*)'s+
^'(?<line1>'w*)''s+
^'(?<line2>'w*)''s+
^'(?<MD5>[A-Fa-f0-9]{32})'
与Multiline
和IgnorePatternWhitespace
regex选项一起使用(后者意味着您可以保留regex布局以获得更好的可读性)。
(*)此外,在无数的例子中,IP地址的正则表达式模式实际上到处都是。当然,如果你认为有必要,你可以使用比'['d.]+'
更复杂的东西。
我在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));
}
}
}