使用正则表达式分组结构匹配部分字符串

Matching parts of string using regex grouping constructs

我有以下字符串格式:

CC-SS[PC|PC|...|PC]

其中:

字符串的正确部分可能不存在。例如:

是有效的字符串。

所以,我想使用正则表达式来仅获取字符串的特定细节(如果存在)。

我尝试使用命名组和以下模式的一些变体:

^(?<country>.*)(?<=-)(?<state>.*)(?<=\[)(?<postalcodes>.*)(?=])

上述模式有两个问题:

通常,我使用正数或负数 look-ahead/behind 并匹配除定界符以外的所有内容 - [^.\]] 但我不确定在匹配多个组时如何应用此技术。

有人能给我一些建议吗?

我想你可以使用

\b(?<country>[A-Z]{2})(?:-(?<state>[A-Z]{2}))?\b(?:\[(?<postalcodes>[^][]*)])?

在 C# 中:

var rx = new Regex(@"\b(?<country>[A-Z]{2})(?:-(?<state>[A-Z]{2}))?\b(?:\[(?<postalcodes>[^][]*)])?");

参见regex demo

详情

  • \b - 单词边界
  • (?<country>[A-Z]{2}) - 组 "country":两个大写 ASCII 字母
  • (?:-(?<state>[A-Z]{2}))? - 一个可选的非捕获组,匹配 1 次或 0 次出现
    • - - 一个连字符
    • (?<state>[A-Z]{2}) - 组 "state":两个大写 ASCII 字母
  • \b - 单词边界
  • (?:\[(?<postalcodes>[^][]*)])? - 一个可选的非捕获组,匹配 1 次或 0 次出现
    • \[(?<postalcodes>[^][]*) - 组 "postalcodes":除 ][
    • 之外的 0 个或更多字符
    • ] - 一个 ] 字符。