簡體   English   中英

正則表達式拆分字符串,提取之前的字符串值和方括號之間的數值

[英]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.

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