使用TCL正则提取特定格式字符串 现有匹配代码返回空求助
TCL正则匹配特定格式字符串问题
问题描述
需要提取符合以下规则的字符串:
- 以字母"K"开头
- 第二个字母为A、H、N、Z、R中的任意一个
- 后续紧跟若干字母
- 包含短横线"-"
- 短横线后为若干字母
- 以两位数字结尾
测试代码执行后返回空输出,测试代码如下:
set title "reserved for KNBCDEF-ABCD01" set greptitle [regexp -all -inline {\mK[AHNZR][A-Za-z]*-[0-9]{2}\M} $title] send_user "Matched patterns: $greptitle\n"
期望匹配的示例:KNBCDEF-ABCD01、KAXXG-YYUU54、KRBEF-ZZ654
问题原因
原正则表达式\mK[AHNZR][A-Za-z]*-[0-9]{2}\M的核心问题是:短横线-之后仅匹配了两位数字,但规则要求短横线后是若干字母再加两位数字,原正则漏掉了横线后的字母部分,导致无法匹配目标字符串。
修正后的正则与代码
将正则修改为\mK[AHNZR][A-Za-z]*-[A-Za-z]*[0-9]{2}\M,补充横线后的字母匹配逻辑,即可覆盖完整规则。
修正后的代码:
set title "reserved for KNBCDEF-ABCD01" set greptitle [regexp -all -inline {\mK[AHNZR][A-Za-z]*-[A-Za-z]*[0-9]{2}\M} $title] send_user "Matched patterns: $greptitle\n"
执行后会正确匹配到KNBCDEF-ABCD01。如果需要更严谨(比如限定字母为大写,匹配示例风格),可将正则中的[A-Za-z]替换为[A-Z],最终正则为\mK[AHNZR][A-Z]*-[A-Z]*[0-9]{2}\M。
内容的提问来源于stack exchange,提问作者Arila
相关产品推荐
相关产品推荐

