簡體   English   中英

正則表達式拆分為兩個字符

[英]Regex.Split on two chars

輸入字符串為: name = valu\\=e;
我想用正則表達式將其拆分為: namevalu\\=e;

因此,拆分表達式應在不帶有\\前綴的char =上拆分。

我想在名稱之后或value \\ = e等之前保留空格。由於SO修剪``,所以這里不能顯示空格。

編輯:輸入字符串可以包含許多名稱=值對。 示例: name=value;name2=value2;

您可以使用以下模式:

@"(?<!\\)="

(?<!..)是斷言后面的斷言,它表示:“不以”開頭

海因茲的問題很有趣。 如果選擇偶數個反斜杠不能轉義等號,則必須用以下方式替換模式:

@"(?<![^\\](?:\\{2})*\\)="
(?<name>[^=]+)=(?<value>[^;]+;)

然后使用命名組“名稱”和“值”分別檢索每個部分。

例如:

var matches = System.Text.RegularExpressions.Regex.Matches("myInput", @"(?<name>[^=]+)=(?<value>[^;]+;)");
        foreach(Match match in matches)
        {
            var name = match.Groups["name"];
            var value = match.Groups["value"];
            doSomething(name, value);
        }

編輯:

我不知道您為什么說它不起作用,這是我在LinqPad中使用您在評論中輸入的內容得到的:

void Main()
{
var matches = System.Text.RegularExpressions.Regex.Matches(@"zenek=ben\\\;\\ek;juzek=jozek;benek2=true;krowa=-2147483648;du-pa=\\\\\\3/\\\=3\;3\;;", @"(?<name>[^=]+)=(?<value>[^;]+;)");
        foreach(Match match in matches)
        {
            var name = match.Groups["name"].Value;
            var value = match.Groups["value"].Value;
            ("Name: "+name).Dump();             
            ("Value: "+value).Dump();
        }
}

結果:

Name: zenek
Value: ben\\\;
Name: \\ek;juzek
Value: jozek;
Name: benek2
Value: true;
Name: krowa
Value: -2147483648;
Name: du-pa
Value: \\\\\\3/\\\=3\;

除了使用正則表達式,您還可以使用“常規”代碼。 :)

string items = "name=value;name2 = valu= = e2";

// Split the list on items.
var itemlist = items.Split(';');
// Split each item after the first '='.
var nameValueArrayList = itemlist.Select(s => s.Split("=".ToCharArray(), 2));
// Convert the list of arrays to a dictionary
var nameValues = nameValueArrayList.ToDictionary(i => i[0], i => i[1]);

MessageBox.Show("<<<" + nameValues["name2 "] + ">>>");

或簡而言之:

string items = "name=value;name2 = valu= = e2";

var nameValues = items
    .Split(';')
    .Select(s => s.Split("=".ToCharArray(), 2))
    .ToDictionary(i => i[0], i => i[1]);

MessageBox.Show("<<<" + nameValues["name2 "] + ">>>");

我個人認為,當規格更改時,這樣的代碼更易於維護或拆解和修改。 並且它為您提供了一個實際的字典,您可以通過它們從鍵中提取值。 也許可以寫得更短一些,但我仍在練習。 :)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM