使用正则表达式捕获C#中字符串中的数值

时间:2011-03-29 02:10:49

标签: c# .net regex

我有一串字符,其中包含0个或更多ABC = dddd个字符。 dddd代表整数值,不一定是四位数。

我想要做的是捕获此模式中出现的整数值。我知道如何与正则表达式进行匹配,但我不熟悉捕获。没有必要在一次调用中捕获所有ABC整数值 - 它可以循环遍历字符串。

如果这太复杂了,我只会写一个小解析器,但如果它相当优雅我想使用正则表达式。专业知识非常感谢。

2 个答案:

答案 0 :(得分:3)

首先,我们需要从与我们正在寻找的模式匹配的正则表达式开始。这将匹配您给出的示例(假设ABC是字母数字):\w+\s*=\s*\d+

接下来,我们需要通过定义捕获组来定义我们想要在匹配中捕获的内容。 .Net包括对命名捕获组的支持,我非常喜欢。我们使用(?<name for capture>expression)指定一个组,将我们的正则表达式转换为:(?<key>\w+)\s*=\s*(?<value>\d+)。这给了我们两个捕获,关键和价值。

使用此功能,我们可以迭代文本中的所有匹配项:

Regex pattern = new Regex(@"(?<key>\w+)\s*=\s*(?<value>\d+)");
string body = "This is your text here.  value = 1234";
foreach (Match match in pattern.Matches(body))
{
    Console.WriteLine("Found key {0} with value {1}", 
        match.Groups.Item["key"].Value, 
        match.Groups.Item["value"].Value
    );
}

答案 1 :(得分:1)

您可以使用以下内容:

MatchCollection allMatchResults = null;
try {
    // This matches a literal '=' and then any number of digits following
    Regex regexObj = new Regex(@"=(\d+)");
    allMatchResults = regexObj.Matches(subjectString);
    if (allMatchResults.Count > 0) {
        // Access individual matches using allMatchResults.Item[]
    } else {
        // Match attempt failed
    } 
} catch (ArgumentException ex) {
    // Syntax error in the regular expression
}

根据你的情节,也许这就是你所追求的更多:

try {
    Regex regexObj = new Regex(@"=(\d+)");
    Match matchResults = regexObj.Match(subjectString);
    while (matchResults.Success) {
        for (int i = 1; i < matchResults.Groups.Count; i++) {
            Group groupObj = matchResults.Groups[i];
            if (groupObj.Success) {
                // matched text: groupObj.Value
                // match start: groupObj.Index
                // match length: groupObj.Length
            } 
        }
        matchResults = matchResults.NextMatch();
    } 
} catch (ArgumentException ex) {
    // Syntax error in the regular expression
}