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

本文关键字:检索 模式 Regex 于单一 | 更新日期: 2023-09-27 18:09:28

我有以下字符串:

"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: 9497,14;PvN: 3 157,25;Úp: 3 102,14;医生: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;

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

您不可能用一个正则表达式得到它们,除非您绝对确定它们会彼此相邻出现。此外,获得所有这些结果并在之后分割结果有什么意义呢?下面是一个正则表达式,它可以找到你想要的值:

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

现在第一组将是键,第二组将是值。

思路是:

  • (x|y|z)匹配xyz
  • [^;)]+匹配一些东西,这不是;(因为这是它们当前的分隔方式)或)(对于最后一个位置)一次或多次

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

让我们修复一个接一个的正则表达式:

  • []字符类之外插入^表示"行开始",因此在不同位置使用两个插入符的表达式将不匹配任何内容。
  • 使用'd代替[0-9]'D代替[^0-9]

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

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

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

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

在循环中重复应用此模式将使您可以一个接一个地提取标记。