[英]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 給出的答案是如何工作的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.