[英]Regex.Split on two chars
輸入字符串為: name = valu\\=e;
我想用正則表達式將其拆分為: name
和valu\\=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.