[英]Regular expression split string, extract string value before and numeric value between square brackets
我需要解析一個看起來像“Abc[123]”的string
。 需要括號之間的數值,以及括號前的string
值。
我測試的大多數示例都可以正常工作,但在解析某些特殊情況時會遇到問題。
此代碼似乎適用於“正常”情況,但在處理“特殊”情況時存在一些問題:
var pattern = @"\[(.*[0-9])\]";
var query = "Abc[123]";
var numVal = Regex.Matches(query, pattern).Cast<Match>().Select(m => m.Groups[1].Value).FirstOrDefault();
var stringVal = Regex.Split(query, pattern)
.Select(x => x.Trim())
.FirstOrDefault();
應該如何調整代碼以處理一些特殊情況? 例如,對於字符串“Abc[]”,解析器應該正確返回“Abc”作為字符串值並指示一個空的數值(最終可能默認為 0)。 對於字符串“Abc[xy33]”,解析器應返回“Abc”作為字符串值並指示無效的數值。 對於字符串“Abc”,解析器應返回“Abc”作為字符串值並指示缺失的數值。 括號前/后或內的空白應修剪為“Abc [123]”。
試試這個模式: ^([^\\[]+)\\[([^\\]]*)\\]
模式的解釋:
^
- 匹配字符串的開頭
([^\\[]+)
- 匹配一個或多個除[
的任何字符並將其存儲在第一個捕獲組中
\\[
- 匹配[
字面意思
([^\\]]*)
- 匹配零個或多個除]
之外的任何字符並存儲在第二個捕獲組中
\\]
- 從字面上匹配]
這是經過測試的代碼:
var pattern = @"^([^\[]+)\[([^\]]*)\]";
var queries = new string[]{ "Abc[123]", "Abc[xy33]", "Abc[]", "Abc[ 33 ]", "Abc" };
foreach (var query in queries)
{
string beforeBrackets;
string insideBrackets;
var match = Regex.Match(query, pattern);
if (match.Success)
{
beforeBrackets = match.Groups[1].Value;
insideBrackets = match.Groups[2].Value.Trim();
if (insideBrackets == "")
insideBrackets = "0";
else if (!int.TryParse(insideBrackets, out int i))
insideBrackets = "incorrect value!";
}
else
{
beforeBrackets = query;
insideBrackets = "no value";
}
Console.WriteLine($"Input string {query} : before brackets: {beforeBrackets}, inside brackets: {insideBrackets}");
}
Console.ReadKey();
輸出:
我們可以嘗試對輸入進行正則表達式替換,以獲得單行解決方案:
string input = "Abc[123]";
string letters = Regex.Replace(input, "\\[.*\\]", "");
string numbers = Regex.Replace("Abc[123]", ".*\\[(\\d+)\\]", "$1");
Console.WriteLine(letters);
Console.WriteLine(numbers);
這打印:
Abc
123
很確定會有一些基於語言的技術,我不知道,但是使用正則表達式,我們將使用捕獲組捕獲所有內容並逐一檢查事物,也許:
^([A-Za-z]+)\s*(\[?)\s*([A-Za-z]*)(\d*)\s*(\]?)\s*$
如果你想探索/簡化/修改表達式,它已在regex101.com 的右上角面板中進行了解釋。 如果您願意,您還可以在此鏈接中觀看它如何與某些示例輸入匹配。
您無需使用正則表達式即可輕松實現
string temp = "Abc[123]";
string[] arr = temp.Split('[');
string name = arr[0];
string value = arr[1].ToString().TrimEnd(']');
輸出名稱 = Abc
,值 = 123
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.