string sentence = "X10 cats, Y20 dogs, 40 fish and 1 programmer.";
string[] digits = Regex.Split (sentence, @"\D+");
对于这段代码,我得到数字数组中的值,如10,20,40,1
string sentence = "X10.4 cats, Y20.5 dogs, 40 fish and 1 programmer.";
string[] digits = Regex.Split (sentence, @"\D+");
对于这段代码我得到数字数组中的值,如10,4,20,5,40,1
但我想用十进制数字来得到这个10.4,20.5,40,1我该怎么办呢。
答案 0 :(得分:26)
@ Michael解决方案的小改进:
// NOTES: about the LINQ:
// .Where() == filters the IEnumerable (which the array is)
// (c=>...) is the lambda for dealing with each element of the array
// where c is an array element.
// .Trim() == trims all blank spaces at the start and end of the string
var doubleArray = Regex.Split(sentence, @"[^0-9\.]+")
.Where(c => c != "." && c.Trim() != "");
返回:
10.4
20.5
40
1
原始解决方案正在返回
[empty line here]
10.4
20.5
40
1
.
答案 1 :(得分:7)
十进制/浮点数提取正则表达式可能会有所不同,具体取决于是否使用千位分隔符,什么符号表示小数分隔符,是否也想匹配指数,是否匹配正号或负号,是否匹配可能省略前导0
的数字,无论是否提取以小数分隔符结尾的数字。
Matching Floating Point Numbers with a Regular Expression中提供了通用正则表达式以匹配最常见的十进制数字类型:
[-+]?[0-9]*\.?[0-9]+(?:[eE][-+]?[0-9]+)?
我只将捕获组更改为非捕获组(?:
后添加(
)。 It matches
如果你需要使它更通用,如果小数点分隔符可以是点或逗号,则将\.
替换为字符类(或括号表达式){ {1}}:
[.,]
注意上面的表达式匹配整数和浮点数。 仅匹配浮点数/小数确保在[-+]?[0-9]*[.,]?[0-9]+(?:[eE][-+]?[0-9]+)?
^^^^
(demo)之后移除第二个?
,必须使用小数模式部分:
\.
现在,[-+]?[0-9]*\.[0-9]+(?:[eE][-+]?[0-9]+)?
^
未匹配:已匹配。
如果您不想匹配没有前导零的浮点数(例如34
),则必须使第一个数字匹配模式(通过添加.5
量词)匹配1或更多出现的数字):
+
见this demo。现在,它匹配更少的样本:
现在,如果您不想匹配[-+]?[0-9]+\.[0-9]+(?:[eE][-+]?[0-9]+)?
^
内的<digits>.<digits>
,该怎么办?如何匹配作为整个单词?使用 lookarounds :
<digits>.<digits>.<digits>.<digits>
现在,那些拥有千位分隔符的浮点数,如[-+]?(?<!\d\.)\b[0-9]+\.[0-9]+(?:[eE][-+]?[0-9]+)?\b(?!\.\d)
或12 123 456.23
呢?您可以在第一个34,345,767.678
之后添加(?:[,\s][0-9]+)*
,以匹配逗号或空格的零个或多个序列,后跟1个数字:
[0-9]+
请参阅regex demo:
如果您需要使用逗号作为小数点分隔符,并使用句点作为千位分隔符,则使用逗号[-+]?(?<![0-9]\.)\b[0-9]+(?:[,\s][0-9]+)*\.[0-9]+(?:[eE][-+]?[0-9]+)?\b(?!\.[0-9])
。
现在,如何在C#中使用这些模式?
\.
答案 2 :(得分:5)
尝试
Regex.Split (sentence, @"[^0-9\.]+")
答案 3 :(得分:1)
检查大多数编程语言的语法词法分析器,以获取小数的正则表达式。 将该正则表达式与字符串匹配,找到所有匹配项。
答案 4 :(得分:1)
您需要在正则表达式中允许小数位。请尝试以下方法:
\d+(\.\d+)?
这将匹配数字而不是数字以外的所有数字,但迭代匹配以构建数组应该很简单。
要记住的是你是否也应该寻找负号,逗号等等。
答案 5 :(得分:0)
如果你有Linq:
stringArray.Select(s=>decimal.Parse(s));
foreach
也可以。您可能需要检查每个string
实际上是一个数字(.Parse
不会抛出异常)。
答案 6 :(得分:0)
以下信用转到@ code4life。我添加的只是一个for循环,用于在返回之前解析整数/小数。
public string[] ExtractNumbersFromString(string input)
{
input = input.Replace(",", string.Empty);
var numbers = Regex.Split(input, @"[^0-9\.]+").Where(c => !String.IsNullOrEmpty(c) && c != ".").ToArray();
for (int i = 0; i < numbers.Length; i++)
numbers[i] = decimal.Parse(numbers[i]).ToString();
return numbers;
}