[英]How to create regular expression
我需要解析以下字符串格式:
property1 value1
property2 value2
property3 val.ue3
其中左邊的單詞是屬性,后面的單詞是它的值。 該值應修整為( \\n
, \\r
, )。
我正在使用以下代碼:
Regex reg = new Regex(string.Format("{0}\\s\\w+", propertyName));
string Val = reg.Match(str).Value;
但是它有一些問題,我很難解決這些問題:
.
,它會在那里修剪字符串(例如,對於property3
它返回val
但應該返回val.ue3
) value2\\r
) 我會用這個
Regex reg = new Regex(string.Format(@"{0}\s+[^\r\n]+", propertyName));
因此,如果您有propertyNames的列表
var output=propertyNames.Select(x=>
new{
PropertyName=x,
Value=Regex.Match(input,string.Format(@"(?<={0}\s+)[^\r\n]+",x))
.Value
});
如果該值具有“。” 它在那里修剪字符串(即對於property3,它返回val,但它應該返回value3)
這是因為\\\\w+
匹配字母數字字符和下划線,而不匹配點字符.
。
它不會在新行或空格中修剪值(有時會返回-“ value2 \\ r”)
我可以看到這是怎么回事,因為正如我上面所說的\\\\w+
匹配單詞字符,因此一旦發現任何其他字符,它就會停止匹配。
更好的正則表達式:
由於傳遞了屬性的名稱,因此剩下一個任務,那就是匹配值,因為值總是以換行符\\n
,回車符\\r
或點結尾.
那么我們可以匹配一個或多個都不是用來捕獲值的字符,如下所示:
{0}\\s*([^\\r\\n ]+)
^^
There is a space here, don't forget it
注意這里有一個空格 在上面的字符類中的
\\\\n
之后。
似乎將字符串放入字典中並使用它會更合適。
var dict =
str.Split(new char[] {'\r', '\n'}, StringSplitOptions.RemoveEmptyEntries)
.Select(x => x.Split(new char[] {' '}, 2))
.ToDictionary(x => x[0], x => x[1]);
string val = dict[propertyName];
我認為您無需為此使用正則表達式。 Split
方法應切芥末:
string input =
@"property1 value1
property2 value2
property3 val.ue3";
IList<KeyValuePair<string, string>> result =
(from line in input.Split(new[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries)
let parts = line.Split(' ')
where parts.Length > 1
select new KeyValuePair<string, string>(parts[0], parts[1])).ToList();
現在您可以使用包含鍵值對的結果:
property1: value1
property2: value2
property3: val.ue3
\\w
與任何字母,數字或下划線匹配(精確定義請參見字字符 ),但與文字不匹配.
。 為此,您可以使用字符類,例如[\\w.]
。
另外,如果要從其他字符串構造模式,則實際上應該使用Regex.Escape
:
Regex reg = new Regex(string.Format(@"{0}\s[\w.]+", Regex.Escape(propertyName)));
string Val = reg.Match(str).Value;
或者可以省去string.Format
:
Regex reg = new Regex(Regex.Escape(propertyName) + @"\s[\w.]+");
string Val = reg.Match(str).Value;
請注意使用@
創建逐字字符串文字。 通常,這使正則表達式更易於閱讀,因為您無需在模式中轉義\\
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.