C#:使用Regex匹配长行文本中的4个数字

时间:2016-06-14 13:55:21

标签: 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"。我已经疯狂试图解决这个问题,我已经提出了两个解决方案,两个都接近工作我猜。我一直在使用Regex作为我迄今为止学到的东西,如果你解释另一种方法,请给出一个很好的解释。

要获得我想要的行,我正在使用StreamReader,假设我想要第三行,我会这样做,

stringLine1 = stringLine1 + objReader.ReadLine() + "\r\n";
stringLine2 = stringLine2 + objReader.ReadLine() + "\r\n";
stringLine3 = stringLine3 + objReader.ReadLine() + "\r\n";

使用Regex,解决方案1:

stringLine3 = Regex.Match(stringLine3, @"[^Register: 0x0092 = 0x][0-9A-Z]+").Value;

这个方法的问题是,如果寄存器有内容0028, - 它没有读取2!

解决方案2:

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

所以这是一个积极的外观,它抓住4个数字继续进行&#39;,问题是它抓住了寄存器号而不是内容....

有关如何解决此问题或做得更好的任何建议?

2 个答案:

答案 0 :(得分:1)

使用lookbehind:

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

或使用小组:

^Register: 0x[0-9A-F]{4} = 0x([0-9A-F]{4})

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

答案 1 :(得分:1)

你所拥有的第一个正则表达式是错误的。它应该像

Register: 0x0092 = 0x([0-9A-Z]+)

此处,寄存器的内容在第1组中捕获。

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

Regex Demo

正则表达式1有什么问题?

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

示例代码可以写为

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组捕获的字符串。match.Groups[0]将包含整个匹配。