【问题标题】:How to extract string two, one in between brackets and two not in brackets?如何提取字符串二,一个在括号之间,两个不在括号中?
【发布时间】:2020-11-25 19:03:59
【问题描述】:

我正在尝试找出一种使用正则表达式将字符串提取为两个值的方法。一个示例字符串是 “区域商店 1 - 麦迪逊 [RSM1]” "区域商店 2 [SS2]"

我想让它们提取到“Regional Store 1 - Madison”、“RSM1”和“Regional Store 2”、“SS2”。

我尝试使用正则表达式 (?

由于字符串将始终遵循“{Name} [{code}]”的格式,我想知道我是否应该只使用 string.split。

【问题讨论】:

  • "Regional Store 1 - Madison [RSM1]" "Regional Store 2 [SS2]" 是一个完整的字符串还是你的意思是将它写成两个单独的字符串?双引号是字符串的一部分吗?
  • 如果 {Name} 部分不能包含“[”或“]”,我认为 string[] parts = myFullString.Split(new char[] { '[',']'},StringSplitOptions.RemoveEmptyEntries) 应该在不使用 TrimEnd 的情况下解决问题。如果它也可以包含这些字符,我会选择int indx = myFullString.LastIndexOf('['); string Name = myFullString.Substring(0, indx); string Code = myFullString.Substring(indx + 1, myFullString.Length - indx - 2);
  • 如果每次只有一行指定格式那么你可以这样使用:var matches = Regex.Matches("Regional Store 1 - Madison [RSM1]", "([^\[ \]]+)\w").ToArray(); var 结果 = $"{matches[0].Value}={matches[1].Value}";

标签: c# .net regex string .net-core


【解决方案1】:

您可以在不使用正则表达式的情况下解决问题,方法是剪掉结尾的 ] 并使用 "["" [" 拆分:

var s = "Regional Store 1 - Madison [RSM1]";
var chunks = s.TrimEnd(']').Split(" [");
Console.WriteLine("Name={0}, Code={1}", chunks[0], chunks[1]);
// => Name=Regional Store 1 - Madison, Code=RSM1

或者,使用正则表达式:

var pattern = @"^(.*?)\s*\[([^][]*)]$";
chunks = Regex.Match(s, pattern)?.Groups.Cast<Group>().Skip(1).Select(x => x.Value).ToArray();
Console.WriteLine("Name={0}, Code={1}", chunks[0], chunks[1]);
// => Name=Regional Store 1 - Madison, Code=RSM1

请参阅 C# demoregex demo

模式详情

  • ^ - 字符串开头
  • (.*?) - 第 1 组:除换行符之外的任何零个或多个字符,尽可能少
  • \s* - 零个或多个空白字符
  • \[ - 一个 [ 字符
  • ([^][]*) - 第 2 组:除 [] 之外的任何零个或多个字符
  • ]$ - ] 字符和字符串结尾。

【讨论】:

  • 谢谢!使用正则表达式与字符串拆分之间是否存在偏好?
  • @redcabbage 总是这样:如果您的字符串格式已知,则首选正则表达式,但每次都可能不同,例如某些部分之间可能存在不同数量的空格,或者数字不同,或者可能有一些多余的重复部分等。如果格式固定并且字符串总是这样,则使用常规的String.SplitString.TrimEnd,“整洁”。
【解决方案2】:

请试试这个模式

MatchCollection mcCollection = Regex.Matches(sIdentifire, @"(Regional\s+Store\s+.+?\[.+?\])");

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-13
    • 1970-01-01
    • 1970-01-01
    • 2016-10-16
    • 2013-08-15
    • 1970-01-01
    相关资源
    最近更新 更多