使用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地址的另一个实例,等等。它应该一直这样做,直到它到达文件的末尾。

我试着自己做这件事,但我甚至不知道从哪里开始,也不知道怎么做

使用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')

提取$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})'

MultilineIgnorePatternWhitespace 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));
    }
}

}