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捕获的字符串。其中asmatch.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