2009-11-06 56 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]); 
    }