试图找出这个正则表达式模式

本文关键字:正则表达式 模式 | 更新日期: 2023-09-27 17:50:47

所以我有一个字符串,我试图从中剥离一些值。我一直在使用这个正则表达式测试器试图弄清楚这是无济于事的: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)之间的整数之外的所有内容。我可能犯了一些业余的错误,因为我对正则表达式模式没有太大的经验,所以任何输入都会非常感激。

试图找出这个正则表达式模式

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

(?<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)

试试这个

(?<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

缺少整数的catch。
我在这里添加了一个新的命名为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: (?.+)

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

您没有为该数字(在您的示例中为63)设置捕获组,它与向导一起被捕获。我对你的图案做了一些修改:

(?<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](以防它只使用十六进制小写字符)

也许检查分隔符更容易:

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

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