在C#中使用Regex(正则表达式)从字符串获取值

时间:2013-11-16 19:40:47

标签: c# regex string expression

我想从Regex的字符串中获取一些值。我将继续解释:

  • 有一个字符串:“玩家#0 Agentep97(12.34.56.78:1234)已连接”
  • 我想获得#[NUMBER],用户名(“Agentep97”),([IP]:[Port])值

我已经尝试使用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”不正确还是其他什么?

提前致谢!

2 个答案:

答案 0 :(得分:3)

由于这个原因,正则表达式可能令人沮丧:它通常是全有或全无的,没有明确的解释为什么它不起作用。我建议的是我如何审查你的正则表达式。我一次添加一个字符/组,直到它停止匹配(使用非常有用且主要与.NET兼容的工具Rubular),然后查看是什么打破了正则表达式。在这种情况下,您似乎忘记了命名群组?ip1ip2ip3ip4中的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
 ^                ^                ^                ^                ^

演示:http://www.rubular.com/r/J8dEEE3HnC

答案 1 :(得分:3)

您可以使用此模式:

Player #(?<number>[0-9]+) (?<username>\S+) \((?<ip>(?>[0-9]{1,3}\.){3}[0-9]{1,3}):(?<port>[0-9]+)\)

我认为您不需要捕获所有单独的IP地址号码。

另一种方法是使用具有此模式的split方法:

[)]?[ :][#(]?