正则表达式中的命名组

时间:2009-07-07 10:31:38

标签: .net regex

我想解析输入字符串并从中提取值。我的输入字符串可能包含周,天,小时或分钟。

因此,输入字符串可能是

  • 1周5天2小时1分钟
  • 或3分钟
  • 或5天1分钟
  • 或2小时等

我想使用正则表达式提取值。

如何在.Net中实现这一目标?

4 个答案:

答案 0 :(得分:4)

我认为使用正则表达式会对此有点过分。如果我是你,我会将字符串标记,将其转换为小写,然后在不同的单词之间切换。这是一种更好的方法来处理已修复已知子字符串的情况。

答案 1 :(得分:2)

以下正则表达式匹配单数或复数(例如天或日),只要这些项目按顺序排列。

//Set the input and pattern
string sInput = "1 Weeks 5 Days 2 Hours 1 Minutes";
string sPattern = "^\s*(?:(?<weeks>\d+)\s*(?:weeks|week))?\s*(?:(?<days>\d+)\s*(?:days|day))?\s*(?:(?<hours>\d+)\s*(?:hours|hour))?\s*(?:(?<minutes>\d+)\s*(?:minutes|minute))?";

//Run the match
Match oMatch = Regex.Match(sInput, sPattern, RegexOptions.IgnoreCase);

//Get the values
int iWeeks = int.Parse(oMatch.Groups["weeks"].Value);
int iDays = int.Parse(oMatch.Groups["days"].Value);
int iHours = int.Parse(oMatch.Groups["hours"].Value);
int iMinutes = int.Parse(oMatch.Groups["minutes"].Value);

答案 2 :(得分:0)

正则表达式中的捕获组用括号括起来(例如"(\d+ Week)")。

使用问号和名称"(?<week>\d+ Week)"完成命名捕获组。

然后返回如下m.Groups("week").Value

完整的正则表达式(未经测试)可能如下所示:

  (?<weeks>\d+ weeks?)\s*(?<days>\d+ days?)\s*(?<hours>\d+ hours?)\s*(?<minutes>\d+ minutes?)

答案 3 :(得分:0)

以下是如何为各种值解析该文本的粗略示例。

Dim inputString As String = "1 Week 5 Days 2 Hours 1 Minutes"
Dim pattern As String = "(?<Week>\d+)\s*week\s*(?<Days>\d+)\s*days\s*(?<Hours>\d+)\s*hours"

Dim m As Match = Regex.Match(inputString, pattern, RegexOptions.Compiled Or RegexOptions.Singleline Or RegexOptions.IgnoreCase)

If m.Success Then
  Dim hours As String = m.Groups("Hours")
   etc...
End If