正则表达式拆分字符串,提取之前的字符串值和方括号之间的数值

Posted

技术标签:

【中文标题】正则表达式拆分字符串,提取之前的字符串值和方括号之间的数值【英文标题】:Regular expression split string, extract string value before and numeric value between square brackets 【发布时间】:2020-01-02 08:21:54 【问题描述】:

我需要解析一个看起来像“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]”。

【问题讨论】:

【参考方案1】:

试试这个模式:^([^\[]+)\[([^\]]*)\]

模式解释:

^ - 匹配字符串的开头

([^\[]+) - 匹配任何字符中的一个或多个[ 并将其存储在第一个捕获组中

\[ - 匹配 [ 字面意思

([^\]]*) - 匹配除] 之外的任何字符的零个或多个并存储在第二个捕获组中

\] - 匹配 ] 字面意思

这里是测试代码:

  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();

输出:

【讨论】:

谢谢,代码似乎涵盖了请求的用例! 后期编辑:不包括字符串完全没有括号的情况,比如“Abc”。 @RickyTad 更新了答案。 应该如何改变模式,以便能够处理括号之间的可选附加文本?例如,这些都应该是有效的字符串:Abc[12]Abc[int:123]Abc[bool: 5]Abc[float : 32 ]【参考方案2】:

我们可以尝试对输入进行正则表达式替换,以获得单线解决方案:

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

【讨论】:

【参考方案3】:

很确定会有一些基于语言的技术,我不知道,但是使用正则表达式,我们将使用捕获组捕获所有内容并逐个检查事物,也许:

^([A-Za-z]+)\s*(\[?)\s*([A-Za-z]*)(\d*)\s*(\]?)\s*$

如果您想探索/简化/修改表达式,它已经 在右上角的面板上进行了解释 regex101.com。如果你愿意,你 也可以在this link看,怎么搭配 针对一些样本输入。


【讨论】:

【参考方案4】:

您无需使用正则表达式即可轻松实现这一目标

string temp = "Abc[123]";
string[] arr =  temp.Split('[');
string name = arr[0];
string value = arr[1].ToString().TrimEnd(']');

输出名称 = Abc,值 = 123

【讨论】:

以上是关于正则表达式拆分字符串,提取之前的字符串值和方括号之间的数值的主要内容,如果未能解决你的问题,请参考以下文章

拆分正则表达式以提取连续字符的字符串

借助正则表达式提取内容

正则表达式如何匹配提取括号中的内容

使用正则表达式从句子中的方括号中提取剩余的子字符串

拆分字符串,提取并添加到另一列正则表达式 BIGQUERY

c#用正则表达式提取小括号中的内容