Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 正则表达式中的命名组_.net_Regex - Fatal编程技术网

.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的库,它专门做这种输入,它的源代码可能对了解他们是如何做的很有价值。