我有用戶輸入,諸如這些正則表達式來從提取隊名「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"
我有用戶輸入,諸如這些正則表達式來從提取隊名「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"
此代碼將球隊和名字之間的區別,讓你簡單的把它撿起來了的正則表達式匹配信息。
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;
}
}
試試這個真的原油計劃:
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.」。
這聽起來像是一個兩步過程......首先提取左側和右側,然後測試它們以確定哪一側包含「團隊」關鍵字。
的正則表達式將是這樣的:
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]+)
編輯: 我的例子將只允許字母數字字符,所以這一切都取決於WH在你需要的時候。
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]);
}
我將使用遞歸下降解析器,而不是正則表達式 – eKek0 2009-11-06 01:06:02
抱歉我不熟悉這一點。你有一些例子嗎? – newbie 2009-11-06 01:32:06
到目前爲止您嘗試過什麼? 你是否在(例如)perl腳本中執行此操作? – azp74 2009-11-06 01:03:09