2017-07-14 55 views
1

我想弄清楚,如何捕捉2組從像文本:我想捕捉的「myvalue的」正則表達式之前可選的結束「 - 」或 S

---MyValue=4497-DD616-1134-34---\r\n 

和「4497 - DD616-1134-34」。可以接受任何字符,\ s字符(\ r,\ n,空格等)和' - '字符重複最少。一次2次。 我現在的正則表達式:

(?<Attribute>[^-\s\r\n]+)=(?<Value>[^-\s\r\n]+) 

它的問題是,從整個「4497 - DD616-1134-34」值之前,只有字母字符的第一捕獲「 - 」號。我需要在字符串末尾附近的「 - 」之前得到整個值。 此外,這個正則表達式應該像琴絃工作:

MyValue=17% 
Number=72 

所以 「---」, 「\ r」, 「\ n」 等字符都是可選的。 我在C#中使用正則表達式。 Example, of what is actually captured

鏈接到正則表達式:Regex link

任何想法?

+0

展現你的表達實際上捕獲的例子。 –

+1

'(\ w +)=(\ w + - \ w + - \ w + - \ w +)'?捕獲組1:'MyValue',捕獲組2:'4497-DD616-1134-34' – Fabien

+0

您使用哪種語言?正則表達式有不同的風格 –

回答

4

你可以使用這樣的正則表達式:

(\w+)=(.*?)(?:\s|--) 

Working demo

在另一方面,如果結束---是可選的,你也有文字\r\n可選過,你可以使用這個正則表達式:

(\w+)=(.*?)(?:\s|--|\\r|\\n) 

Working demo

2

使用

(?<Attribute>\w+)=(?<Value>(?:(?!-{3})\S)+) 

.NET regex demo

或者,如果值僅由連字符分隔字字符序列任選%結束,你可能會考慮更詳細的正則表達式,如:

(?<Attribute>\w+)=(?<Value>\w+(?:-\w+)*%?) 

請參閱another demo

enter image description here

詳細

  • (?<Attribute>\w+) - 「屬性」 基團:1或更大的字字符
  • = - 一個=符號
  • (?<Value>(?:(?!-{3})\S)+) - 「價值」 基團:匹配任何非空白字符(\S),它不會啓動---個字符序列,1次或更多次。
    OR
  • \w+ - 1或多個單詞字符
  • (?:-\w+)* - 任選%符號 - 的-和1+字字符
  • %?零個或更多序列。

C# demo

var pat = @"(?<Attribute>\w+)=(?<Value>(?:(?!-{3})\S)+)"; 
var s = "---MyValue=4497-DD616-1134-34---\r\n---MyNum=72 MyPercent=17% --- "; 
var res = Regex.Matches(s, pat) 
    .Cast<Match>() 
    .ToDictionary(
     m => m.Groups["Attribute"].Value, 
     m => m.Groups["Value"].Value 
    ); 
foreach (var kvp in res) 
{ 
    Console.WriteLine("[{0}, {1}]", kvp.Key, kvp.Value); 
} 

輸出:

[MyValue, 4497-DD616-1134-34] 
[MyNum, 72] 
[MyPercent, 17%]