簡體   English   中英

結合正則表達式檢索匹配案例

[英]Combining regex to retrieve match cases

我有以下字符串

[1] weight | width | depth | 5.0 cm | 6.0 mm^2 | 10.12 cm^3

從中我需要從上面的字符串中提取名稱、值和單位,如下所示

name = weight
value = 5.0
unit = cm

name = width
value = 6.0
unit = cm^2

name = depth
value = 10.12
unit = cm^3

對於每個匹配案例,我都有以下正則表達式。 每個人都按預期工作。 但是需要結合正則表達式,所以它會返回預期的匹配情況。 我嘗試將它們全部組合並使用|。 但沒有奏效。 這是個人比賽的工作正則表達式

For Name : (?<name>\b\w+(?:[\w]\w+)+\b)
For Value : (?<![\^])(?<value>[+-]?[0-9]+(?:\.[0-9]+)?)(?!\S)
For Unit : \b[0-9]+(?:\.[0-9]+)?[^\S\r\n]+(?<unit>[^0-9\s]\S*)(?:[^\S\r\n]+\||$)

誰可以幫我這個事。 謝謝

如果管道數量相同,您可以使用捕獲組作為名稱,並在前瞻中捕獲值和單位:

(?<!\S)(?<name>\w+)(?=(?:[^|]*\|){3}\s*\b(?<value>[0-9]+(?:\.[0-9]+)?)\s+(?<unit>[^0-9\s]\S*))

正則表達式演示

僅供參考如何使用@TheFourthBird提供的模式

using System;
using System.Text.RegularExpressions;
using System.Linq;
                    
public class Program
{
    public static void Main()
    {
        string s = "[1] weight | width | depth | 5.0 cm | 6.0 mm^2 | 10.12 cm^3";
        int n = s.Split('|').Length / 2;
        string pat = @"(?<!\S)(?<name>\w+)(?=(?:[^|]*\|){" + n + @"}\s*\b(?<value>[0-9]+(?:\.[0-9]+)?)\s+(?<unit>[^0-9\s]\S*))";
        
        var ItemRegex = new Regex(pat, RegexOptions.Compiled);
        var OrderList = ItemRegex.Matches(s)
                            .Cast<Match>()
                            .Select(m => new
                            {
                                Name = m.Groups["name"].ToString(),
                                Value = Convert.ToDouble(m.Groups["value"].ToString()),
                                Unit = m.Groups["unit"].ToString(),
                            })
                            .ToList();
        Console.WriteLine(String.Join("; ", OrderList));
    }
}

印刷:

{ Name = weight, Value = 5, Unit = cm }; { Name = width, Value = 6, Unit = mm^2 }; { Name = depth, Value = 10.12, Unit = cm^3 }

在這里嘗試其他示例


注意:我絕不是 C# 開發人員。 我碰巧調整在 SO 上找到的代碼,以展示 TheFourthBird 給出的答案是如何工作的。

使用此正則表達式捕獲相應的組

\[\d+\]\s(\w+)\s\|\s(\w+)\s\|\s(\w+)\s\|\s(\S+)\s(\S+)\s\|\s(\S+)\s(\S+)\s\|\s(\S+)\s(\S+)

然后使用替換替換

name = $1\nvalue = $4\nunit = $5\n\nname = $2\nvalue = $6\nunit = $7\n\nname = $3\nvalue = $8\nunit = $9

請參閱正則表達式演示 另請參閱 C#演示

暫無
暫無

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

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