下面是一个不是代码的文本文件,
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;,问题是它抓住了寄存器号而不是内容....
有关如何解决此问题或做得更好的任何建议?
答案 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组中的捕获。正则表达式1有什么问题?
[^Register: 0x0092 = 0x]
这个,[]
是一个字符类。这意味着它会尝试匹配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组捕获的字符串。match.Groups[0]
将包含整个匹配。