试图弄清楚这种正则表达式模式

时间:2013-01-06 17:03:36

标签: c# regex expression

所以我有一个字符串,我试图从中删除一些值。我一直在使用这个正则表达式测试器来试图解决这个问题无济于事: http://derekslager.com/blog/posts/2007/09/a-better-dotnet-regular-expression-tester.ashx

这是我要解析的字符串:

9   2.27.8.18:2304        63   9dd0e5e7344adac5cf49b7882329df25(OK) Any number of characters follow here

基本格式为:

INT IP:PORT INT MD5-HASH(OK) STRING

到目前为止,这是我的目标:

(?<line_id>[0-9]{1,3})(?<ip>.+):(?<port>[0-9]{1,5})(?<guid>.+)\(OK\)(?<name>.+)

这些是我迄今为止能够剥离的价值观:

9 (line_id)
2.27.8.18 (ip)
2304 (port)
63   9dd0e5e7344adac5cf49b7882329df25(guid)
Any number of characters follow here (name)

如果您尝试上面发布的示例文本和模式,您可以看到除了端口号和md5哈希(guid)之间的整数之外我得到的所有内容。我可能犯了一些业余错误,因为我对正则表达式模式不太熟悉,所以任何输入都会非常感激。

5 个答案:

答案 0 :(得分:2)

.+通常是一个坏主意,因为它会贪婪地匹配字符串中的任何字符。

(?<line_id>[0-9]{1,3})[\s]+(?<ip>[0-9\.]+):(?<port>[0-9]{1,5})[\s]+(?<int>[0-9]{1,5})[\s]+(?<guid>[a-z0-9]+)\(OK\)(?<name>.+)

这会产生:

9 (line_id)
2.27.8.18 (ip)
2304 (port)
63 (int)
9dd0e5e7344adac5cf49b7882329df25 (guid)
 Any number of characters follow here (name)

答案 1 :(得分:1)

缺少整数的捕获 我在这里添加了一个名为int的新命名反向引用。

试试这个:

(?<line_id>[0-9]{1,3})(?<ip>.+):(?<port>[0-9]{1,5})\s+(?<int>[0-9]+)\s+(?<guid>.+)\(OK\)(?<name>.+)

现在您有以下6个捕获组:

line_id group 1: (?[0-9]{1,3})
ip group 2: (?.+)
port group 3: (?[0-9]{1,5})
int group 4: (?[0-9]{1,5})
guid group 5: (?.+)
name group 6: (?.+)
恕我直言,最近的两组人太贪心了。而不是使用.+我建议更好地识别你需要捕捉的角色范围。

答案 2 :(得分:1)

试试这个

(?<line_id>[0-9]{1,3})\s+(?<ip>.+):(?<port>[0-9]{1,5})\s+(?<number>[0-9]+)\s+(?<guid>.+)\(OK\)(?<name>.+)

在您提供的测试页中获得此结果

has 6 groups:

9 (line_id)
2.27.8.18 (ip)
2304 (port)
63 (number)
9dd0e5e7344adac5cf49b7882329df25 (guid)
Any number of characters follow here (name)

*请注意用于识别 63

的空间

答案 3 :(得分:0)

您没有为该号码设置捕获组(在您的情况下为63),这是与guid一起捕获的。我已经编辑了你的模式:

(?<line_id>\d{1,3})\s*(?<ip>.+):(?<port>\d{1,5})\s*(?<number>\d+?)\s*(?<guid>[\da-f]+)\(OK\)(?<name>.+)

请注意,我已将[0-9]设置更改为\ d,guid设置为:[\ da-f](如果它只使用十六进制小写字符。

答案 4 :(得分:0)

检查分隔符可能更容易:

(?<line_id>[0-9]{1,3})(?<ip>.+):(?<port>[0-9]{1,5})\s+(?<nr>.*)\s+(?<guid>.+)\(OK\)(?<name>.+)

以下是一个示例:http://rubular.com/r/qhS7TdTFmn