我有用户输入,例如这些
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"
答案 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;
}
}