Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从“A vs B”列表中提取团队名称的正则表达式_C#_Regex - Fatal编程技术网

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

C# 从“A vs B”列表中提取团队名称的正则表达式,c#,regex,C#,Regex,我有这样的用户输入 paul vs Team Apple Orange Team Apple Orange vs paul Team Apple Orange v.s. paul 我需要编写一个正则表达式来检测分隔符vs,vs,v.s.两侧的单词,并将带有关键字team的一侧存储到variable team,另一侧存储到name name = "paul" team = "Apple Orange" 试试这个非常粗糙的程序: string[] tests = new string[] {

我有这样的用户输入

paul vs Team Apple Orange
Team Apple Orange vs paul
Team Apple Orange v.s. paul
我需要编写一个正则表达式来检测分隔符vs,vs,v.s.两侧的单词,并将带有关键字team的一侧存储到variable team,另一侧存储到name

name = "paul"
team = "Apple Orange"

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

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上正确匹配。

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

正则表达式应该是这样的:

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

根据您的示例,左侧和右侧将在正则表达式匹配的第1组和第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]+)
编辑:
我的示例只允许使用字母数字字符,因此这完全取决于您需要什么。

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

/(.+)\s+(?:vs|v|v\.s\.)\s+(.+)/
然后,您可以为团队检查$1和$2,并将其剥离以获得团队名称。 或使用

如果$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]);
    }

这段代码将区分团队和名称,允许您从正则表达式匹配信息中简单地提取它

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;
  }
}

做:vs | v\.s\.有什么好处吗。?超过v\.?s\?这取决于你想要或需要多严格。你想匹配vs和v.s吗?到目前为止你试过什么?例如,您是在perl脚本中执行此操作的吗?我将使用递归下降解析器而不是正则表达式。很抱歉,我不熟悉这一点。你有一些例子吗?
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;
  }
}