我很擅长使用正则表达式,我可以弄清楚如何从字符串中提取特定数字。
假设字符串是任何数量的空格或随机文本,其中的某个位置是“Value:$ 1000.00。”
为了检索我目前正在使用的值:
string value = Convert.ToString(Regex.Match(BodyContent, @"Value:[ \t]*\$?\d*(\.[0-9]{2})?", RegexOptions.Singleline));
因此变量'value'现在存储了“Value:$ 1000.00”。
我的问题是,使用Regex是否有办法使用'Value:'来查找数字值,但只在'value'变量中存储实际数值(即1000.00)?
答案 0 :(得分:3)
一般来说,要完成这样的事情,你至少有3个选择:
(?=...)
,(?<=...)
,以便您可以精确匹配要捕获的内容
(...)
捕获特定字符串
substring
鉴于此测试字符串:
i have 35 dogs, 16 cats and 10 elephants
这些是一些正则表达式模式的匹配:
\d+ cats
- &gt; 16 cats
(see on rubular.com)\d+(?= cats)
- &gt; 16
(see on rubular.com)(\d+) cats
- &gt; 16 cats
(see on rubular.com)
16
您还可以执行多次捕获,例如:
(\d+) (cats|dogs)
会产生2个匹配结果(see on rubular.com)
35 dogs
35
dogs
16 cats
16
cats
在这种情况下使用捕获组(see on ideone.com)要简单得多:
var text = "Blah blah Value: $1000.00 and more stuff";
string value = Convert.ToString(
Regex.Match(
text,
@"Value:[ \t]*\$?(\d*(\.[0-9]{2})?)",
RegexOptions.Singleline
).Groups[1]
);
唯一添加的是:
.Groups[1]
对象的Match
答案 1 :(得分:2)
在.NET中,您需要获取Match对象,然后访问其Groups属性:
Match m = Regex.Match(BodyContent, @"Value:[ \t]*\$?(?<amount>\d*(\.[0-9]{2})?)", RegexOptions.Singleline);
string value = null;
if (m.Success)
{
value = m.Groups["amount"].Value;
}
语法(?<amount> ... )
创建一个名称捕获组,该名称捕获组按名称存储在m.Groups集合中。