我对正则表达式非常新,所以请耐心等待,
我有以下格式的某些字符串
"Lot Containing 450 Acres"
**OUTPUT:** 450
"3 flats have an area of 50 Acres" etc.
**OUTPUT:** 50
"LOT CONTAINING 0.44 ACRES"
**OUTPUT:** 0.44
我的要求是提取在Acres
'之前发生的号码。
我知道这可以通过使用各种STRING
类方法来完成,例如substring,contains,Char.IsDigit等。
但这似乎是一个非常繁琐的过程,
有人可以帮助我采用更好的方法,最好使用Regex
吗?
编辑1:
@MongZhu建议的解决方案适用于除小数之外的所有整数。我尝试过修改他的解决方案以使其适用于小数,
string input = "3.96 ACRES" ;
string pattern = @"(\d+[.]\d+)(?=\sACRES)";
"LOT CONTAINING 0.44 ACRES"
OUTPUT: 0.44
但是
"Lot Containing 450 Acres"
OUTPUT:
答案 0 :(得分:1)
您可以尝试使用模式中的括号匹配数字和与组相关联的单词:
string input = "Lot Containing 450 Acres" ;
string pattern = @"(\d+)(\sAcres)";
模式说明:
\d+
匹配数字的一个或多个出现
\s
只匹配一个空白字符
// test output
foreach (Group group in Regex.Match(input, pattern).Groups)
{
Console.WriteLine(group.Value);
}
输出:
450英亩 450个
亩
如您所见,第二组具有您需要的值。通过以下方式访问:Groups[1]
string number = Regex.Match(input, pattern).Groups[1].Value;
或者您可以使用Looklahead并仅在数字后跟空格和单词Acres
时匹配:
string pattern = @"(\d+)(?=\sAcres)";
Console.WriteLine(Regex.Match(input, pattern).Value);
输出:
450
修改强>
如果您需要匹配十进制数字,那么您需要包含一个可选模式:[点后跟一个或多个数字]:(\.\d+)*
说明:
\.
匹配点
(\.\d+)*
匹配括号内容的零个或多个出现。星号*
使十进制数字可选
使匹配可选的另一种方法是在模式后面使用?
:(\.\d+)?
。这将给你相同的结果