我想从Regex的字符串中获取一些值。我将继续解释:
我已经尝试使用var match = Regex.Match(input, @"Player #(?<player_id>[0-9]{1,3})\s(?<user>.+)\s\((<ip1>\d{1,3})\.(<ip2>\d{1,3})\.(<ip3>\d{1,3})\.(<ip4>\d{1,3})\:(<port>\d{1,5}$)\) connected\W\D\S", RegexOptions.IgnoreCase);
,但我没有成功,所以我无法获得player_id.Value等。
你会怎么做? “var match”不正确还是其他什么?
提前致谢!
答案 0 :(得分:3)
由于这个原因,正则表达式可能令人沮丧:它通常是全有或全无的,没有明确的解释为什么它不起作用。我建议的是我如何审查你的正则表达式。我一次添加一个字符/组,直到它停止匹配(使用非常有用且主要与.NET兼容的工具Rubular),然后查看是什么打破了正则表达式。在这种情况下,您似乎忘记了命名群组?
,ip1
,ip2
,ip3
和ip4
中的port
:
Player #(?<player_id>[0-9]{1,3})\s(?<user>.+)\s\(
(?<ip1>\d{1,3})\.(?<ip2>\d{1,3})\.(?<ip3>\d{1,3})\.(?<ip4>\d{1,3})\:(?<port>\d{1,5}$)\) connected\W\D\S
^ ^ ^ ^ ^
答案 1 :(得分:3)
您可以使用此模式:
Player #(?<number>[0-9]+) (?<username>\S+) \((?<ip>(?>[0-9]{1,3}\.){3}[0-9]{1,3}):(?<port>[0-9]+)\)
我认为您不需要捕获所有单独的IP地址号码。
另一种方法是使用具有此模式的split方法:
[)]?[ :][#(]?