2009-07-07 97 views
1

我想解析输入字符串并从中提取值。我的输入字符串可能有周,日,小时或分钟。正则表达式中的命名组

因此,输入字符串可能

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

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

如何在.Net中实现这一点?

+1

他们总是会有序吗? – stevehipwell 2009-07-07 10:38:34

回答

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); 
4

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

+2

+1这就是我只想发布。 – Gumbo 2009-07-07 10:37:46

0

正则表达式中的捕获组包含在括号内(例如"(\d+ Week)")。

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

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

的完整的regex(未经测试)可能是这个样子:

(?<weeks>\d+ weeks?)\s*(?<days>\d+ days?)\s*(?<hours>\d+ hours?)\s*(?<minutes>\d+ minutes?) 
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