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