簡體   English   中英

使用正則表達式從單行字符串中提取重復模式

[英]Extract repeated patterns from a single-line string using Regex

我有一個如下所示的字符串:

attr one = 1 attr two = 2

我想提取每個attr x = y (其中 x 和 y 可以是任何東西,包括空格,而不僅僅是數字,例如:attr name = Jonah)。

我嘗試了以下模式: Regex pattern = new Regex(@"attr\s+(?<name>.*)\s+=\s+(?<value>.*)")但它在單個匹配中返回整個字符串並且不會將它們分開。

我怎樣才能做到這一點?

您可以使用

\battr\s+(?<name>\S*)\s+=\s+(?<value>.*?)(?=\s+attr\s|\z)

查看正則表達式演示

細節

  • \battr - 一個完整的單詞attr
  • \s+ - 1+ 個空格
  • (?<name>\S*) - 組“名稱”:0 個或多個非空白字符
  • \s+=\s+ - a = char 包含 1+ 個空格
  • (?<value>.*?) - 組“值”:除換行符之外的任何 0 個或多個字符盡可能少...
  • (?=\s+attr\s|\z) - 緊隨其后的是 1+ 個空格、 attr和一個空格,或者是字符串的結尾。

請參閱C# 演示(假設names都是唯一的):

var text = "attr one = one two three attr two = 3";
var dct = Regex.Matches(text, @"\battr\s+(?<name>\S*)\s+=\s+(?<value>.*?)(?=\s+attr\s|\z)")
        .Cast<Match>()
        .ToDictionary(p => p.Groups["name"].Value, p => p.Groups["value"].Value); 
foreach (var kvp in dct)
    Console.WriteLine("{0} -> {1}", kvp.Key, kvp.Value);

Output:

one -> one two three
two -> 3

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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