.net 正则表达式中的命名组
我想解析输入字符串并从中提取值。我的输入字符串可能有周、天、小时或分钟 因此,输入字符串可能是.net 正则表达式中的命名组,.net,regex,.net,Regex,我想解析输入字符串并从中提取值。我的输入字符串可能有周、天、小时或分钟 因此,输入字符串可能是 1周5天2小时1分钟 还是3分钟 或5天1分钟 或2小时等 我想使用正则表达式提取值 如何在.Net中实现这一点?我认为使用正则表达式会有点过分。如果我是你,我只会标记字符串,将其转换为小写,然后在不同的单词之间切换。处理已修复已知子字符串的情况时,这是一种更好的方法。我认为使用正则表达式会有点过分。如果我是你,我只会标记字符串,将其转换为小写,然后在不同的单词之间切换。处理已修复已知子字符串的情
- 1周5天2小时1分钟
- 还是3分钟
- 或5天1分钟
- 或2小时等
如何在.Net中实现这一点?我认为使用正则表达式会有点过分。如果我是你,我只会标记字符串,将其转换为小写,然后在不同的单词之间切换。处理已修复已知子字符串的情况时,这是一种更好的方法。我认为使用正则表达式会有点过分。如果我是你,我只会标记字符串,将其转换为小写,然后在不同的单词之间切换。处理已修复已知子字符串的情况时,这是一种更好的方法。正则表达式中的捕获组用括号括起来(例如,
“(\d+Week)”
)
命名的捕获组使用问号和名称“”(?\d+Week)”
完成
然后按如下方式返回它们,m.Groups(“week”).Value
完整正则表达式(未测试)可能如下所示:
(?<weeks>\d+ weeks?)\s*(?<days>\d+ days?)\s*(?<hours>\d+ hours?)\s*(?<minutes>\d+ minutes?)
(?\d+周?)\s*(?\d+天?)\s*(?\d+小时?\s*(?\d+分钟?)
正则表达式中的捕获组用括号括起来(例如,“(\d+Week)”
)
命名的捕获组使用问号和名称“”(?\d+Week)”
完成
然后按如下方式返回它们,m.Groups(“week”).Value
完整正则表达式(未测试)可能如下所示:
(?<weeks>\d+ weeks?)\s*(?<days>\d+ days?)\s*(?<hours>\d+ hours?)\s*(?<minutes>\d+ minutes?)
(?\d+周?)\s*(?\d+天?)\s*(?\d+小时?\s*(?\d+分钟?)
下面是一个粗略的示例,说明如何解析文本中的各种值
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
Dim inputString As String=“1周5天2小时1分钟”
Dim模式为String=“(?\d+)\s*周\s*(?\d+)\s*天\s*(?\d+)\s*小时”
Dim m As Match=Regex.Match(输入字符串、模式、RegexOptions.Compiled或RegexOptions.Singleline或RegexOptions.IgnoreCase)
如果m.成功了那么
字符串形式的小时数=m.Groups(“小时”)
等
如果结束
下面是一个粗略的示例,说明如何解析文本中的各种值
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
Dim inputString As String=“1周5天2小时1分钟”
Dim模式为String=“(?\d+)\s*周\s*(?\d+)\s*天\s*(?\d+)\s*小时”
Dim m As Match=Regex.Match(输入字符串、模式、RegexOptions.Compiled或RegexOptions.Singleline或RegexOptions.IgnoreCase)
如果m.成功了那么
字符串形式的小时数=m.Groups(“小时”)
等
如果结束
以下正则表达式匹配单数或复数(例如天或天),只要项目按顺序排列
//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);
//设置输入和模式
字符串sInput=“1周5天2小时1分钟”;
字符串SPATERN=“^\s*(?:(?\d+)\s*(?:(?\d+)\s*(?:(?\d+)\s*(?:天))?\s*(?:(?\d+)\s*(?:小时|小时))?\s*(?:(?\d+)\s*(?:分钟|)分钟”);
//跑完比赛
匹配oMatch=Regex.Match(sInput、SPATERN、RegexOptions.IgnoreCase);
//获取值
int-iWeeks=int.Parse(oMatch.Groups[“weeks”].Value);
int-iDays=int.Parse(oMatch.Groups[“天”].Value);
int iHours=int.Parse(oMatch.Groups[“小时”].Value);
int iMinutes=int.Parse(oMatch.Groups[“分钟”].Value);
以下正则表达式匹配单数或复数(例如天或天),只要项目按顺序排列
//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);
//设置输入和模式
字符串sInput=“1周5天2小时1分钟”;
字符串SPATERN=“^\s*(?:(?\d+)\s*(?:(?\d+)\s*(?:(?\d+)\s*(?:天))?\s*(?:(?\d+)\s*(?:小时|小时))?\s*(?:(?\d+)\s*(?:分钟|)分钟”);
//跑完比赛
匹配oMatch=Regex.Match(sInput、SPATERN、RegexOptions.IgnoreCase);
//获取值
int-iWeeks=int.Parse(oMatch.Groups[“weeks”].Value);
int-iDays=int.Parse(oMatch.Groups[“天”].Value);
int iHours=int.Parse(oMatch.Groups[“小时”].Value);
int iMinutes=int.Parse(oMatch.Groups[“分钟”].Value);
它们是否始终有序?它们是否始终有序?+1从核心正则表达式用户的角度来看,这不是正则表达式的一个好用途,因为它将是多程正则表达式。如果你试图容忍交替拼写和其他逻辑,这将很难维持。如果你真的感兴趣的话,有一个用ruby编写的名为chronos的库,专门做这种输入,它的源代码可能很有价值,看看他们是如何做的。从一个硬核regex用户那里得到+1,这对regex不是一个好用,因为它是多通regex。如果你试图容忍交替拼写和其他逻辑,这将很难维持。如果您真的感兴趣,有一个用ruby编写的名为chronos的库,它专门做这种输入,它的源代码可能对了解他们是如何做的很有价值。