簡體   English   中英

如何在C#中使用正則表達式從字符串中獲取部分

[英]how to get a part from a string with regular expression in C#

如何獲得“名稱”值和“年齡”值?

案例1數據:

aaa bbbb; Name=John Lewis; ccc ddd; Age=20;

案例2數據:

AAA bbbb; Age=21;

我的正則表達式:

(?:Name=(?'name'[\w\b]+)\;)[\s\S]*Age=(?'age'\d+)\;?

但是無法獲取值(名稱,年齡)。

這是您想要的正則表達式。 (?<Key>\\w+?)=(?<Value>(?:\\w|\\s)+);

此模式將鍵/值對捕獲到命名組KeyValue中

如果鍵名包含空格,則此解決方案將無法正常運行。

C#用法

using System;
using System.Text;
using System.Text.RegularExpressions;
using System.Linq;

public class Test
{
    public static void Main()
    {
        string input = @"aaa bbbb; Name=John Lewis; ccc ddd; Age=20;";
        string pattern = @"(?<Key>\w+?)=(?<Value>(?:\w|\s)+);";

        var matches = Regex.Matches(input, pattern);
        foreach (var match in matches.OfType<Match>())
        {
            string key = match.Groups["Key"].Value;
            string value = match.Groups["Value"].Value;
            Console.WriteLine(key + ": " + value);
        }
    }
}

產量

Name: John Lewis
Age: 20

情況1:僅Name是可選的

您所用的正則表達式應說明一個可選的“ Name字段。

(?:\bName=(?<Name>[^;]+).*?;\s+)?\bAge=(?<Age>\d+)
^^^                            ^^

正則表達式演示

如果“ Name和“ Age數據在單獨的行上,則將regex與RegexOptions.Singleline標志一起使用。

詳細資料

  • (?:\\bName=(?<Name>[^;]+).*?;\\s+)? -可選的子模式字符串
    • \\bName= -整個單詞“名稱” + =
    • (?<Name>[^;]+) -組“名稱”,捕獲除1以外的1個字符;
    • .*? -任意0+個字符(如果不使用(?s)則換行符(?s)
    • ; -分號
    • \\s+ -1個或多個空格
  • \\bAge= -整個單詞Age + =
  • (?<Age>\\d+) -捕獲匹配1個以上數字的“年齡”組。

C#演示

var strs = new[] { "aaa bbbb; Name=John Lewis; ccc ddd; Age=20;", "AAA bbbb; Age=21;" };
var pattern = @"(?:\bName=(?<Name>[^;]+).*?;\s+)?\bAge=(?<Age>\d+)";
foreach (var str in strs) 
{
    var result = Regex.Match(str, pattern);
    if (result.Success) 
        Console.WriteLine("Name: \"{0}\", Age: \"{1}\"", result.Groups["Name"].Value, result.Groups["Age"].Value);
}
// => Name: "John Lewis", Age: "20"
//    Name: "", Age: "21"

情況2: NameAge都是可選的

對兩個字段都使用可選組:

(?:\bName=(?<Name>[^;]+).*?;\s+)?(?:\bAge=(?<Age>\d+))?
^^^                            ^^^^^                 ^^

觀看此C#演示

var strs = new[] { "aaa bbbb; Name=John Lewis; ccc ddd; Age=20;", "AAA bbbb; Age=21;", "Irrelevant", "My Name=Wiktor; no more data" };
var pattern = @"(?:\bName=(?<Name>[^;]+).*?;\s+)?(?:\bAge=(?<Age>\d+))?";
foreach (var str in strs) 
{
    var results = Regex.Matches(str, pattern)
        .Cast<Match>()
        .Where(m => m.Groups["Name"].Success || m.Groups["Age"].Success)
        .Select(p => new {key=p.Groups["Name"].Value, val=p.Groups["Age"].Value} )
        .ToList();
    foreach (var r in results)
        Console.WriteLine("Name: \"{0}\", Age: \"{1}\"", r.key, r.val);
}

否則,如果您想使用對正則表達式引擎更友好的模式,請使用兩個分支的交替,其中兩個模式中的任何一個都是必須的(以避免空匹配處理):

var strs = new[] { "aaa bbbb; Name=John Lewis; ccc ddd; Age=20;", "AAA bbbb; Age=21;", "Irrelevant", "My Name=Wiktor; no more data" };
var pattern = @"(?:\bName=(?<Name>[^;]+).*?;\s+)?\bAge=(?<Age>\d+)|\bName=(?<Name>[^;]+)(?:.*?;\s+\bAge=(?<Age>\d+))?";
foreach (var str in strs) 
{
    var result = Regex.Match(str, pattern);
    if (result.Success)
    {
        Console.WriteLine("Name: \"{0}\", Age: \"{1}\"", result.Groups["Name"].Value, result.Groups["Age"].Value);
    }
}

觀看此C#演示

(?:\\bName=(?<Name>[^;]+).*?;\\s+)?\\bAge=(?<Age>\\d+)|\\bName=(?<Name>[^;]+)(?:.*?;\\s+\\bAge=(?<Age>\\d+))? 有2個分支:

  • (?:\\bName=(?<Name>[^;]+).*?;\\s+)?\\bAge=(?<Age>\\d+) - Name部分是可選的, Age是必填項
  • | - 要么
  • \\bName=(?<Name>[^;]+)(?:.*?;\\s+\\bAge=(?<Age>\\d+))? - Age部分為可選項, Name為必填項

...

.*?(?:Name=(?'name'[^;]*);)*.*?(?:Age=(?'age'\d*);)*
(?'name'\w+)[=]{1}(?'value'[\w ]+)

此正則表達式將為您提供namevalue組。 name您將擁有姓名年齡value中將有John Lewis20

您可以在此處查看其工作方式

暫無
暫無

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

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