Regex-=直到;之后的值;

本文关键字:之后 Regex- 直到 | 更新日期: 2023-09-27 18:00:37

我试图自己创建Regex,但我做不到。所以我希望得到一些帮助。我得到这样的字符串:

test=foo;test1=bar;test2=;test3= .some.other.stuff

我的正则表达式用于查找"="之后的值

(?<=@test=).+?(?=;)

它只适用于

  1. @试验=
  2. test1=(并且仅当它在=之后有一个值时)

有人能帮我吗?我只需要"="后面的值,如果没有值,我需要一个"空匹配"。

更棘手的是字符串的末尾,因为它不再有";"。

Regex-=直到;之后的值;

除非解析代码的性能非常重要,否则Split将生成可读性更强的代码:

 var pairs = text
   .Split(';')
   .Select(v => v.Split('='))
   .Select(pair=> new KeyValuePair<string, string>(pair[0], pair.Length==2? pair[1]:""));

Regex版本可能如下所示:

Regex.Matches("test=foo;test1=bar;test2=;test3= .some.other.stuff",
   "([^=]+)=([^;]*)(?:;*)");

主要部分-指定最后一个;字符为"可选非捕获组"-(?:;*)

只获取值:

[^;]+=(?<val>[^;]*)

将输出

val: foo
val: bar
val: 
val:  .some.other.stuff

(是的,空字符串上仍然有一个匹配项,但字符串是"")。您可以在模式中使用+而不是*来消除这种匹配。

是一种更完整的方法,可以为您提供密钥和值

(?<key>[^;])+=(?<val>[^;]*)

输出

key: t
val: foo
key: 1
val: bar
key: 2
val: 
key: 3
val:  .some.other.stuff

如果你只是做这样的事情(这里没有LINQ)怎么办:

string yourString = @"test=foo;test1=bar;test2=;test3=someotherstuff";
string[] temp = yourString.Split(';');
Dictionary<string, string> values = new Dictionary<string, string>();
for(int i = 0; i < temp.Length; i += 2) 
{
   var temp2 = temp[i].Split('=');
   values.Add(temp2[0], temp2[1]);
}