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;
您不可能用一个正则表达式得到它们,除非您绝对确定它们会彼此相邻出现。此外,获得所有这些结果并在之后分割结果有什么意义呢?下面是一个正则表达式,它可以找到你想要的值:
(ZP|NP|SP|SDS|IP|PvN|ÚP|GP|PRFS): ([^;)]+)
现在第一组将是键,第二组将是值。
思路是:
-
(x|y|z)
匹配x
或y
或z
-
[^;)]+
匹配一些东西,这不是;
(因为这是它们当前的分隔方式)或)
(对于最后一个位置)一次或多次
我尝试用以下正则表达式逐个检索值:
让我们修复一个接一个的正则表达式:
- 在
[]
字符类之外插入^
表示"行开始",因此在不同位置使用两个插入符的表达式将不匹配任何内容。 - 使用
'd
代替[0-9]
和'D
代替[^0-9]
下面是一个匹配NP:
模式(demo)的表达式:
NP: 'd+'D'd+([.,]'d{1,4})?
现在将其转换为匹配其他标记的表达式,如下所示:
(NP|ZP|SP|...): 'd+'D'd+([.,]'d{1,4})?
在循环中重复应用此模式将使您可以一个接一个地提取标记。