C#正则表达式

时间:2011-01-18 11:43:33

标签: c# regex

假设我有一个初始字符串,可以包含整数或双精度,后跟一个时间刻度。例如,它可能是5.5小时或30分钟等。我将以这种格式接收的数据众所周知没有统一,所以,例如,我可以接收诸如5.5小时的数据。增加了句号。

我想要一种从这样的字符串中提取整数或双精度的方法,但是我正在努力考虑可能包含额外的句号/句号。我可以通过用emptyspace替换字母来轻松地隔离数字和fullstops。

任何人都可以提供建议。

感谢。

3 个答案:

答案 0 :(得分:3)

\d+(?:\.\d+)?

应符合您的标准:

\d+  # Match one or more digits
(?:  # Try to match the following group:
 \.  # a dot
 \d+ # one or more digits
)?   # End of optional group 

所以,迭代字符串中的所有匹配项:

Regex regexObj = new Regex(@"\d+(?:\.\d+)?");
Match matchResults = regexObj.Match(subjectString);
while (matchResults.Success) {
    // matched number: matchResults.Value
    matchResults = matchResults.NextMatch();
}

这个正则表达式不会像1.05E-6那样以指数表示法匹配数字。显然。

如果您还想捕获以下时间刻度,则可以使用

(\d+(?:\.\d+)?)\s*(\w+)

现在,匹配后,matchResults.Groups[1]将包含该号码。 matchResults.Groups[2]将包含该数字后面的单词,然后您可以根据允许的单词列表进行检查。这个词是强制性的,我。即如果它丢失了,那么整个正则表达式都会失败 - 如果你不想这样做,最后添加一个?

答案 1 :(得分:1)

使用(命名)组提取您需要的信息:

(?'val'\d+\.?\d*).*?

或:     (? 'VAL' \ d +。?\ d *)\ W +。? 应该做的工作,你会在命名组'val'中找到结果。

答案 2 :(得分:1)

也许是这样的:

@"\b(\d+(?:\.\d+)?)\s+(?:hours|mins|seconds)\b"