2009-11-06 22 views
0

我有用户输入,诸如这些正则表达式来从提取队名“A对B”目录

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

我需要编写一个正则表达式,其检测所述分隔符两侧的话(VS, vs,vs),并将关键字“团队”保存到变量团队中,另一个名称。

name = "paul" 
team = "Apple Orange" 
+0

我将使用递归下降解析器,而不是正则表达式 – eKek0 2009-11-06 01:06:02

+0

抱歉我不熟悉这一点。你有一些例子吗? – newbie 2009-11-06 01:32:06

+0

到目前为止您尝试过什么? 你是否在(例如)perl脚本中执行此操作? – azp74 2009-11-06 01:03:09

回答

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

编辑:,如果你想允许 “与”和“v.s”正确匹配只是改变表达式:

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

第一个版本将只正确匹配“与”或者“V.S.”。

+0

只是通过'v \'?s \。?''做'(?:vs | v \。?s \。?)'有什么好处吗? – 2009-11-06 01:10:45

+0

这取决于你想要或需要的严格程度。你想匹配“vs.”和“v.s”? – cletus 2009-11-06 01:11:36

+0

是两个....... – newbie 2009-11-06 01:30:57

3

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

的正则表达式将是这样的:

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

左侧和右侧将是第1组和正则表达式匹配

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]+) 

编辑: 我的例子将只允许字母数字字符,所以这一切都取决于WH在你需要的时候。

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名($ 90元== “团队”)和$ 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]); 
    }