我对正则表达式非常陌生,所以请耐心等待,
我有以下格式的某些字符串
"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:
最佳答案
您可以尝试在您的模式中使用括号将数字和 assined 单词匹配到组:
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 Acres
450
Acres
如您所见,第二组具有您需要的值。通过以下方式访问: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+)?
。这会给你相同的结果
关于c# - 如何检索在另一个子字符串之前领先的数字子字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48518809/