![](/img/trans.png)
[英]How to write regular expression to get the substring from the string using regular expression in 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)+);
此模式將鍵/值對捕獲到命名組Key和Value中 。
如果鍵名包含空格,則此解決方案將無法正常運行。
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
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"
Name
和Age
都是可選的 對兩個字段都使用可選組:
(?:\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*);)*
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.