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