假设我有一个初始字符串,可以包含整数或双精度,后跟一个时间刻度。例如,它可能是5.5小时或30分钟等。我将以这种格式接收的数据众所周知没有统一,所以,例如,我可以接收诸如5.5小时的数据。增加了句号。
我想要一种从这样的字符串中提取整数或双精度的方法,但是我正在努力考虑可能包含额外的句号/句号。我可以通过用emptyspace替换字母来轻松地隔离数字和fullstops。
任何人都可以提供建议。
感谢。
答案 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"