我有以下字符串:
"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;
答案 0 :(得分:1)
你不能用一个正则表达式来获取它们,除非你绝对确定它们都会彼此相邻。而且,无论如何,获得所有这些并且不得不在之后拆分结果的重点是什么。这是一个正则表达式,可以找到你想要的值:
(ZP|NP|SP|SDS|IP|PvN|ÚP|GP|PRFS): ([^;)]+)
现在第一组将成为关键,第二组将成为价值。
这个想法是:
(x|y|z)
匹配x
或y
或z
[^;)]+
匹配的内容不是;
(因为这是当前分隔的方式)或)
(针对最后一个位置)一次或多次答案 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})?
重复循环应用此模式可让您逐个提取标记。