0

所以我有一个字符串,我试图从中删除一些值。我一直在使用这个正则表达式测试器来试图解决这个问题: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) 之间的整数之外的所有内容。我可能犯了一些业余错误,因为我对正则表达式模式不太熟悉,所以任何输入都将不胜感激。

4

5 回答 5

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)
于 2013-01-06T17:09:20.940 回答
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: (?.+)

恕我直言,最新的两组太贪心了。.+我建议不要使用,而是更好地识别您需要捕捉的字符范围。

于 2013-01-06T17:10:06.717 回答
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的空格

于 2013-01-06T17:10:29.703 回答
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] (以防它仅使用十六进制小写字符。

于 2013-01-06T17:10:25.047 回答
0

检查分隔符可能更容易:

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

这是一个例子:http ://rubular.com/r/qhS7TdTFmn

于 2013-01-06T17:12:09.423 回答