簡體   English   中英

如何創建正則表達式

[英]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.

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