【发布时间】:2019-12-25 08:16:45
【问题描述】:
我的字符串格式如下:
CC-SS[PC|PC|...|PC]
地点:
- CC 是国家代码
- SS 是状态码
- PC|PC|...|PC 是用竖线分隔的邮政编码字符串
字符串的正确部分可能不存在。例如:
- 美国
- 美国-IL
是有效的字符串。
所以,我想使用正则表达式仅获取字符串的特定详细信息(如果存在)。
我尝试使用命名组和以下模式的一些变体:
^(?<country>.*)(?<=-)(?<state>.*)(?<=\[)(?<postalcodes>.*)(?=])
上述模式有两个问题:
- 首先,它仅适用于字符串的完整表示(缩短的不匹配)
- 其次,我无法拒绝分隔符的匹配(
-,[,])
通常,我使用正面或负面的前瞻/后视并匹配除定界符之外的所有内容 - [^.\]],但我不确定在匹配多个组时如何应用此技术。
任何人都可以建议我可以尝试的东西吗?
【问题讨论】:
-
我个人认为,虽然功能强大,但正则表达式并不总是最好的选择,因为它会导致难以阅读和调试代码。使用自定义函数解析上述字符串会相当简单。
-
@TimRutter 谢谢。我现在就是这样做的。只是想知道我是否可以使用正则表达式使其更短/更智能。
-
一般建议:不要使用
.*和前瞻,使用负字符类将字符匹配到分隔符。例如,要匹配直到第一个-的所有内容,只需匹配[^-]+ -
\b(?<country>[A-Z]{2})(?:-(?<state>[A-Z]{2}))?\b(?:\[(?<postalcodes>[^][]*]))??见this demo -
@WiktorStribiżew 它似乎有效。我现在将进行更多测试。
标签: c# regex regex-lookarounds regex-group