C#:使用正则表达式匹配长文本行中的4个数字

C#:使用正则表达式匹配长文本行中的4个数字,c#,regex,C#,Regex,下面是一个文本文件,不是代码 Register: 0x0090 = 0x009D //blah blah blah blah Register: 0x0091 = 0x03F6 //blah blah blah blah Register: 0x0092 = 0x0048 //blah blah blah blah Register: 0x0093 = 0x00C8 //blah blah blah blah 我需要提取寄存器内容,不包括“0x”。我一直在疯狂地试图解决这个问题,我已经想

下面是一个文本文件,不是代码

Register: 0x0090 = 0x009D  //blah blah blah blah
Register: 0x0091 = 0x03F6 //blah blah blah blah
Register: 0x0092 = 0x0048  //blah blah blah blah
Register: 0x0093 = 0x00C8  //blah blah blah blah
我需要提取寄存器内容,不包括“0x”。我一直在疯狂地试图解决这个问题,我已经想出了两个解决方案,我想这两个方案都很有效。到目前为止,我一直在使用正则表达式,如果你解释另一种方法,请给出一个很好的解释

为了得到我想要的行,我使用StreamReader,假设我想要第三行,我会这样做

stringLine1 = stringLine1 + objReader.ReadLine() + "\r\n";
stringLine2 = stringLine2 + objReader.ReadLine() + "\r\n";
stringLine3 = stringLine3 + objReader.ReadLine() + "\r\n";
使用正则表达式,解决方案1:

stringLine3 = Regex.Match(stringLine3, @"[^Register: 0x0092 = 0x][0-9A-Z]+").Value;
这个方法的问题是,如果寄存器的内容为0028,-它不会读取2

解决方案2:

stringLine3 = Regex.Match(stringLine3, @"(?<=x)\d{4}").Value;
stringLine3=Regex.Match(stringLine3,@)(?使用查找:

(?<== 0x)[0-9A-F]{4}

在第二种情况下,您必须检索第一组而不是整个匹配项。

您拥有的第一个正则表达式是错误的

Register: 0x0092 = 0x([0-9A-Z]+)
这里,寄存器的内容在组1中捕获

  • ([0-9A-Z]+)
    匹配数字或大写,在组1中捕获


正则表达式1中有什么错误?

  • [^Register:0x0092=0x]
    This,
    []
    是一个字符类。这意味着它尝试匹配除
    R
    e
    g
    等以外的任何内容。这是因为您放置了一个否定该类的
    ^
    。如果删除
    ^
    ,它将匹配字符类中的任何内容

示例代码可以编写为

String stringLine3 = "Register: 0x0092 = 0x0048  //blah blah blah blah";
Match match = Regex.Match(stringLine3, @"Register: 0x0092 = 0x([0-9A-Z]+)");
System.Console.WriteLine(match.Groups[1]);
// 0x0048
  • match.Groups[1]
    获取组1捕获的字符串。其中as
    match.Groups[0]
    将具有整个匹配

您好,添加您正在使用的语言作为regex flavor,这样您就可以获得特定的帮助。它似乎是C#但我不确定。第一次发布时,不确定如何做到这一点!是的,它是C sharp。我应该把它放在标题中吗?有人已经为您做了:)仅供参考,您的第一个正则表达式在括号内有一个字符类=一组字符,或者在您的情况下,有一个否定的字符类(括号内的首字母
^
),即
[^Register:0x0092=0x]
匹配任何不在类中的字符-任何
寄存器:0x92=
。由于
0028
包含
2
它将不匹配。无论如何,它匹配任何不在类中的字符,后跟任意数量的数字或大写(“英文”)字母。您的意思可能类似于
^Register:0x0092=0x[0-9A-F]+
匹配以寄存器0x0092=0x开头的字符串,后跟任意数字(>=1)十六进制字符的。这是因为它匹配整个字符串。使用
Match
的Group方法获取Group 1=第一个捕获的组。响应很好,但很抱歉,我应该更具体一些,我使用的是C sharp,此代码不适用于它:(非常好的响应,这完全有道理,但我正在尝试使用stringLine3=Regex.Match(stringLine3,@“^Register:0x0092=0x([0-9A-Z]+))来完成).Value;它给了我整个字符串back@JohnJ是的,它是在第1组中捕获的。使用
Groups
获取它。已使用代码更新了答案。谢谢!我需要使用组进行研究,因为这似乎是更好的练习,我现在将使用第一种方法
String stringLine3 = "Register: 0x0092 = 0x0048  //blah blah blah blah";
Match match = Regex.Match(stringLine3, @"Register: 0x0092 = 0x([0-9A-Z]+)");
System.Console.WriteLine(match.Groups[1]);
// 0x0048