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

C#Regex基于单个模式检索多个值,c#,regex,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)" 我试图做的是检索以下字母的所有值(如果存在)(我在下面用粗体突出显示了必要的值): 483432,96(HM:369694,86;ZP:32143,48;NP

我有以下字符串:

"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)"
我试图做的是检索以下字母的所有值(如果存在)(我在下面用粗体突出显示了必要的值):

483432,96(HM:369694,86;ZP:32143,48;NP:4507,19;SP:40800,62;SDS:4389,84;IP:9497,14;PvN:3157,25;Úp:3102,14;GP:808,28;PRFS:15332,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;

你不能用一个正则表达式把它们全部取出来,除非你绝对确定它们都会出现在彼此旁边。还有,把它们都弄到手,然后再把结果平分,这又有什么意义呢。下面是一个正则表达式,它可以找到您想要的值:

(ZP|NP|SP|SDS|IP|PvN|ÚP|GP|PRFS): ([^;)]+)
现在,第一组将是键,第二组将是值

这个想法是:

  • (x | y | z)
    匹配
    x
    y
    z
  • [^;)]+
    匹配的内容不是
    (因为这是它们当前的分隔方式)或
    (对于最后一个位置)一次或多次
我尝试使用以下正则表达式逐个检索值:

string regex = "NP: ^[0-9]^[\\s\\d]([.,\\s\\d][0-9]{1,4})?$";
让我们逐一修复您的正则表达式:

  • 插入符号
    ^
    字符类之外的
    []
    字符表示“行的开始”,因此在不同位置有两个插入符号的表达式将不匹配任何内容
  • 使用
    \d
    代替
    [0-9]
    \d
    代替
    [^0-9]
下面是一个与
NP:
pattern()匹配的表达式:

现在将其转换为与其他标记匹配的表达式,如下所示:

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

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

这就像一个符咒!非常感谢。然而,有一个问题是,当您没有指定您对数字感兴趣时,为什么能够检索该值?我什么地方都看不见\\d[0-9]哦,你刚才回答了我的问题:)@RobertJ.,我在回答中补充了说明
[^x]
基本上匹配的字符不是
x
。这里,数字是匹配的,因为它们不是