2017-07-14 50 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%]