C#Regex基于单个模式检索多个值

时间:2015-08-22 10:36:42

标签: c# regex

我有以下字符串:

"483 432,96 (HM: 369 694,86; ZP: 32 143,48; NP: 4 507,19; SP: 40 800,62; SDS: 4 389,84; IP: 9 497,14; PvN: 3 157,25; ÚP: 3 102,14; GP: 808,28; PRFS: 15 332,16)"

我要做的是检索以下字母的所有值(如果存在)(我在下面以粗体突出显示了必要的值):

483 432,96(HM:369 694,86; ZP:32 143,48; NP:4 507,19; SP:40 800,62; SDS:4 389,84; IP:9 497 ,14; PvN:3 157,25;ÚP:3 102,14; GP:808,28; PRFS:15 332,16

我尝试使用以下正则表达式逐个检索值:

string regex = "NP: ^[0-9]^[\\s\\d]([.,\\s\\d][0-9]{1,4})?$";

但也没有运气(我是Regex模式的新手)。

是否可以在一个字符串中检索所有值(然后简单地遍历结果),或者我当时是否必须输入一个键?

这是我的完整代码:

string sTest = "483 432,96 (HM: 369 694,86; ZP: 32 143,48; NP: 4 507,19; SP: 40 800,62; SDS: 4 389,84; IP: 9 497,14; PvN: 3 157,25; ÚP: 3 102,14; GP: 808,28; PRFS: 15 332,16)";
string regex = "NP: ^[0-9]^[\\s\\d]([.,\\s\\d][0-9]{1,4})?$";
System.Text.RegularExpressions.MatchCollection coll = System.Text.RegularExpressions.Regex.Matches(sTest, regex);
String result = coll[0].Groups[1].Value;

2 个答案:

答案 0 :(得分:1)

你不能用一个正则表达式来获取它们,除非你绝对确定它们都会彼此相邻。而且,无论如何,获得所有这些并且不得不在之后拆分结果的重点是什么。这是一个正则表达式,可以找到你想要的值:

(ZP|NP|SP|SDS|IP|PvN|ÚP|GP|PRFS): ([^;)]+)

现在第一组将成为关键,第二组将成为价值。

这个想法是:

  • (x|y|z)匹配xyz
  • [^;)]+匹配的内容不是;(因为这是当前分隔的方式)或)(针对最后一个位置)一次或多次

答案 1 :(得分:1)

  

我尝试使用以下正则表达式逐个检索值:

让我们修复你的一对一正则表达式:

  • ^字符类之外的Caret []表示“行首”,因此在不同位置使用两个插入符号的表达式将无法匹配任何内容。
  • 使用\d代替[0-9]\D代替[^0-9]

这是一个匹配NP:模式(demo)的表达式:

NP: \d+\D\d+([.,]\d{1,4})?

现在将其转换为与其他标记匹配的表达式:

(NP|ZP|SP|...): \d+\D\d+([.,]\d{1,4})?

重复循环应用此模式可让您逐个提取标记。