正则表达式从“A vs B”列表中提取团队名称

时间:2009-11-06 00:57:55

标签: c# regex

我有用户输入,例如这些

paul vs Team Apple Orange
Team Apple Orange vs paul
Team Apple Orange v.s. paul

我需要编写一个正则表达式来检测分隔符两侧的单词(vs,vs.,vs),并将关键字“team”的一侧存储到变量团队,将另一个存储到名称。

name = "paul"
team = "Apple Orange"

5 个答案:

答案 0 :(得分:5)

尝试这个非常粗糙的程序:

string[] tests = new string[] {
  "paul vs Team Apple Orange",
  "Team Apple Orange vs paul",
  "Team Apple Orange v.s. paul"
};

foreach (string line in tests)
{
  string pattern = "(?:Team )?(.*?)\\s+(?:vs|v\\.s\\.)\\s+(?:Team )?(.*)";
  Regex regex = new Regex(pattern);
  Match match = regex.Match(line);
  Console.WriteLine(line);
  if (match.Success)
  {
    string team1 = match.Groups[1].Value;
    string team2 = match.Groups[2].Value;
    Console.WriteLine("Team 1 : " + team1);
    Console.WriteLine("Team 2 : " + team2);
  }
  else
  {
    Console.WriteLine("No match found");
  }
  Console.WriteLine();
}
Console.ReadLine();

输出:

paul vs Team Apple Orange
Team 1 : paul
Team 2 : Apple Orange

Team Apple Orange vs paul
Team 1 : Apple Orange
Team 2 : paul

Team Apple Orange v.s. paul
Team 1 : Apple Orange
Team 2 : paul

修改:如果您想允许“vs.”并且“v.s”正确匹配只是将表达式更改为:

string pattern = "(?:Team )?(.*?)\\s+(?:v\\.?s\\.?)\\s+(?:Team )?(.*)";

第一个版本只能在“vs”或“v.s。”上正确匹配。

答案 1 :(得分:3)

这听起来像是一个两步程序...首先提取左侧和右侧,然后测试它们以确定哪一侧包含“team”关键字。

正则表达式将是这样的:

Regex.Match(input, "(.+)\s+v.?s.?\s+(.+)", RegexOptions.IgnoreCase)

左侧和右侧将位于正则表达式匹配的第1组和第2组

答案 2 :(得分:2)

基于您的示例......这有效:

(?<Team>Team[\w\s]+)\s(?:vs|v\.s\.|vs\.)\s(?<Name>[\w]+)|(?<Name>[\w]+)\s(?:vs|v\.s\.|vs\.)\s(?<Team>Team[\w\s]+)

修改 我的例子只允许字母数字字符,所以这一切都取决于你需要的东西。

答案 3 :(得分:0)

cletus的答案是正确的,但你无法分辨哪个组是名称,哪个组是团队。使用更简单的

/(.+)\s+(?:vs|v|v\.s\.)\s+(.+)/

然后你可以检查1美元和2美元的“团队”,并将其剥离以获得团队名称。 或者使用

/(?:(team\s+)?(.+))\s+(?:vs|v|v\.s\.)\s+(?:(team\s+)?(.+))/

然后如果$ 1 ==“团队”,那么团队是$ 2,名称是$ 4 或者如果未定义$ 1,则名称为$ 2($ 3 ==“团队”),$ 4为团队

这是javascript,而不是c#,但它表明:

  var m = "team paul vs apples oranges".match(/(?:(team\s+)?(.+))\s+(?:vs|v|v\.s\.)\s+(?:(team\s+)?(.+))/);
    for(var i in m) {
       console.log(i + ": " + m[i]);
    }

答案 4 :(得分:0)

此代码将区分团队和名称,允许您从正则表达式匹配信息中简单地选择它。

Regex test = new Regex(@"(?i)^(?:(?:Team\s+(?<team>.*?))|(?<name>.*?))(?:\s+(?<vs>v\.?s\.?)\s+)(?:(?:Team\s+(?<team>.*?))|(?<name>.*?))$");
foreach (string input in ...)
{
  Match match = test.Match(input);
  if (match.Success) 
  {
    string team = match.Groups["team"].Value;
    string name = match.Groups["name"].Value;
  }
}