如何在另一个子字符串之前检索前导数字的子字符串

时间:2018-01-30 10:11:20

标签: c# regex

我对正则表达式非常新,所以请耐心等待,

我有以下格式的某些字符串

"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: 

1 个答案:

答案 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+)?。这将给你相同的结果