C# 使用正则表达式从大文件中提取文本?

C# 使用正则表达式从大文件中提取文本?,c#,regex,text,C#,Regex,Text,我有一个包含大量数据的大文件,但本质上我想做的是只获取其中的一部分,让我解释一下我感兴趣的部分: (将“x”想象为IP地址) (将“?”想象为任意字母数字字符/w任意长度) (将“MD5”想象成MD5散列) (实际-不是字面上的-下面的文本文件) “xxx.xxx.xxx.xxx” XXXXXXXXX '?' '?' “MD5” 现在我的问题如下,我怎样才能确定线路 'xxx.xxx.xxx.xxx' 在文件开头的任意位置,然后自动将找到的每个IP地址实例的“?”项和“MD5”项写入另一个文

我有一个包含大量数据的大文件,但本质上我想做的是只获取其中的一部分,让我解释一下我感兴趣的部分:

(将“x”想象为IP地址)

(将“?”想象为任意字母数字字符/w任意长度)

(将“MD5”想象成MD5散列)

(实际-不是字面上的-下面的文本文件)


“xxx.xxx.xxx.xxx” XXXXXXXXX '?' '?' “MD5”
现在我的问题如下,我怎样才能确定线路

'xxx.xxx.xxx.xxx'

在文件开头的任意位置,然后自动将找到的每个IP地址实例的“?”项和“MD5”项写入另一个文件

简而言之,程序应该从文件的开头开始,读取内容,如果它遇到一个IP地址(
Regex:'\b\d{1,3}.\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

代码:


鉴于您的文件是机器生成的,并且整个模式非常具体,我认为没有必要对IP地址过于具体

在模式的其余部分(*)的上下文中,将其匹配为“单引号中的一组数字和点”可能就足够了

下面是一个表达式,它将您的整个需求匹配为:

^'(?[\d.]+)\s+
^(?\w*)\s+
^“(?\w*)”\s+
^“(?\w*)”\s+
^“(?[A-Fa-f0-9]{32}”
将其与
多行
IgnorePatternWhitespace
一起使用(后者意味着您可以保留regex布局以提高可读性)



(*)此外,在无数的例子中,IP地址的正则表达式模式几乎无处不在。当然,如果您认为有必要的话,您可以使用比
'[\d.]+'
更复杂的东西。

我已经在Java中试用过,如下所示

公共类TestRegex {


}

您的正则表达式在我这端生成“找到0个匹配项”。@manchala-这是实际文本文件的一部分。你也可以像我一样在那里评估你的正则表达式。@AxDSanMuramasa
regex101
不支持c#。。我正在使用
regexstorm
进行测试。。检查答案中的演示..我现在明白了,你可以检查这个,因为你注意到它现在有点近了,但是IP地址识别需要一些工作,实际上我想跳过IP地址下面的一行,并识别2个用户+MD5@AxDSanMuramasa你能用预期的结果来回答这个问题吗?
x
的第二行是什么,没有点的那一行?@Tomalak,一些ID号,并不代表相对重要性。我不会用Regex来读取文件。在以下网页上使用类似“我的代码”的代码:。您可以使用正则表达式来标识一行是否包含IP,但不要在整个文件上使用正则表达式。请张贴文件的实际部分,以便我能提供帮助。我已经做了40多年的文本解析。这是一种更方便的方法,但是我如何迭代我找到的每个元素。。。?我应该使用for循环并识别它们吗?是的,.NETRegex文档和互联网上的许多答案和代码示例向您展示了如何做到这一点。这是一个非常基本的问题,你很容易自己解决。我回答的重点更多的是强调了一些有用的特性。NET正则表达式。
('\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b')(\s*.+\s*)([\s\S]*?)('\b[a-f0-9]{32}\b')
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));
}
/**
 * @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));
    }

}