正则表达式检索封装在()中的字符串的一部分

时间:2010-09-18 08:29:51

标签: c# .net regex

我只是想检索一个字符串的两个子字符串,它采用以下形式。第一个是数值(只有一个)被括在括号之间,如(12345) - 这可以是任意数量的数字(我没有真正保留任何统计数据),但应该在1到10位之间掩盖它。第二个子串采用$ some数值+ $ second数值的形式,如($ 100 + $ 5),所以我又如何拉呢?我已经“搜索”了可能的解决方案,并且惨遭失败以获得某些工作,所以一点点解释可能会帮助我学习一些东西......

我忘记提及数值可以是$ 100 + $ 5.20或$ 10 + $ 0.20或$ 0.05 / $ 0.10。

感谢。

4 个答案:

答案 0 :(得分:1)

要在括号中找到数字:

var input = "Blah (12345) blah";
var m = Regex.Match(input, @"\((\d+)\)");
if (m.Success)
    // Outputs 12345
    Console.WriteLine(m.Groups[1].Value);

对于美元+数字表达式:

var input = "Blah ($100 + $5) blah";
var m = Regex.Match(input, @"\(\$(\d+)\s*\+\s*\$(\d+)\)");
if (m.Success)
{
    // Outputs 100
    Console.WriteLine(m.Groups[1].Value);
    // Outputs 5
    Console.WriteLine(m.Groups[2].Value);
}

答案 1 :(得分:0)

如果你想检索只有一个正则表达式的两个子串,你可以做,取决于原始字符串中的两个子串的顺序:

input = "bla bla (12345) bla bla ($123 + $456) bla bla"

\((\d+)\).*?\(\$(\d+)\s*\+\s*\$(\d+)\)

input = "bla bla ($123 + $456) bla bla (12345) bla bla"

\(\$(\d+)\s*\+\s*\$(\d+)\).*?\((\d+)\)

如果数字长度介于1到10位数之间,则可以\d+

替换所有出现的\d{1,10}

更新:

如果您想将数字与可选小数部分匹配,则必须将\d+更改为\d+(?:\.\d\d)?,然后正则表达式变为:

\((\d+(?:\.\d\d)?)\).*?\(\$(\d+(?:\.\d\d)?)\s*\+\s*\$(\d+(?:\.\d\d)?)\)

答案 2 :(得分:0)

我会建议这个表达式:

(?<Group1>\(\d+\))|(?<Group2>\(\$\d+\s*\+\s*\$\d+\))

它在您要匹配的两个组之间使用“或”。因此,这些在输入中出现的顺序或频率无关紧要。每当“或”条件的某个部分匹配时,您将在生成的匹配集合中获得正则表达式匹配。名称“Group1”和“Group2”使您可以更轻松地访问匹配的内容:match.Groups [“Group1”]。例如值

答案 3 :(得分:-1)

/\((\d+)\)/对于第一个子串
第二个/\((\$\d+(?:\s*\+\s*\$\d+)*)\)/

对于第一个子字符串,我实际上只查看“(”和“)”之间的数字。

第二个将查找“$”后跟数字,然后查找包含“+”并后跟“$”和数字的组。最后一组可以重复多次。 它也会匹配($12 +$30+ $13 + $14)

第二种方法是/\((\$\d+ \+ \$\d+)\)/。这次来自前一个正则表达式的“最后一组”不存在。它只查找“$”后跟数字,然后是空格,“+”,另一个空格,再次是“$”后跟数字。


一个简单的警告,我在我的正则表达式中使用了“/”分隔符,你必须将它们删除才能在C#中使用正则表达式