c# - 如何检索在另一个子字符串之前领先的数字子字符串

标签 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: 

最佳答案

您可以尝试在您的模式中使用括号将数字和 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/

相关文章:

c# - 在 LINQ 中选择计数

c# - 嵌套的 Parallel.For() 循环速度和性能

mysql - 在插入表之前应用正则表达式从 .csv 加载数据

html - 删除(不间断的)字符串中的空格字符

c# - 在 winforms 中创建动态 UI

c# - 是否可以在编译时检查值?

c# - 使用 PInvoke char** (C -> C#) 更正返回值

java - 使用正则表达式匹配和分组表达式的每个术语和运算符

regex - 在 PostgreSQL 中使用正则表达式分割地址字符串但保留其中的数字

c# - asp.net 和 javascript 中的正则表达式语法是否相同?