使用正则表达式分组结构匹配部分字符串
Matching parts of string using regex grouping constructs
我有以下字符串格式:
CC-SS[PC|PC|...|PC]
其中:
- 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 个或更多字符
]
- 一个 ]
字符。
我有以下字符串格式:
CC-SS[PC|PC|...|PC]
其中:
- 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 个或更多字符
]
- 一个]
字符。