我怎么不包括正则表达式的一部分

时间:2010-06-09 18:41:59

标签: c# regex string

我很擅长使用正则表达式,我可以弄清楚如何从字符串中提取特定数字。

假设字符串是任何数量的空格或随机文本,其中的某个位置是“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)?

2 个答案:

答案 0 :(得分:3)

一般来说,要完成这样的事情,你至少有3个选择:

  • 使用外观(?=...)(?<=...),以便您可以精确匹配要捕获的内容
    • 某些语言对lookbehinds的支持有限
  • 使用捕获组(...)捕获特定字符串
    • 近乎普遍支持各种口味
  • 你也可以参加比赛的substring
    • 如果要打印的前缀/后缀的长度是已知常量
    • ,则效果很好

参考


实施例

鉴于此测试字符串:

i have 35 dogs, 16 cats and 10 elephants

这些是一些正则表达式模式的匹配:

您还可以执行多次捕获,例如:

  • (\d+) (cats|dogs)会产生2个匹配结果(see on rubular.com
    • 结果1:35 dogs
      • 第1组捕获35
      • 第2组捕获dogs
    • 结果2:16 cats
      • 第1组捕获16
      • 第2组捕获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]
);

唯一添加的是:

  • 模式中的一对匹配的parantheses以捕获数字部分
  • 访问.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集合中。