我有用户输入,诸如这些正则表达式来从提取队名“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