使用Regexp匹配TCL中的某个重复模式字符串输入

使用Regexp匹配TCL中的某个重复模式字符串输入,regex,tcl,Regex,Tcl,我想检查输入是否与特定的重复模式匹配 模式=3个大写字符,后跟2位数字,并用“:”分隔。 我尝试了下面的regexp,但它不起作用 # This should return "Input Criteria Meet" set user_input_1 "AAB22:GHD23:UDJ29:YUD51" if {[regexp {^[[A-Z]{3}[0-9]{2}:]+$} $user_input_1]} { puts "Input C

我想检查输入是否与特定的重复模式匹配

模式=3个大写字符,后跟2位数字,并用“:”分隔。

我尝试了下面的regexp,但它不起作用

# This should return "Input Criteria Meet"
set user_input_1 "AAB22:GHD23:UDJ29:YUD51"

if {[regexp {^[[A-Z]{3}[0-9]{2}:]+$} $user_input_1]} {
    puts "Input Criteria Meet"
} else {
    puts "Input Criteria not meet"
}

我已经尝试了以下方法,并且效果良好

regexp {^[A-Z]{2}[0-9]{2}(:[A-Z]{2}[0-9]{2})+$} $user_input_1

我已经尝试了以下方法,并且效果良好

regexp {^[A-Z]{2}[0-9]{2}(:[A-Z]{2}[0-9]{2})+$} $user_input_1

这个怎么样?假设您有4个部件,否则将
{4}
替换为
+

^([A-Z]{3}\d{2}(:|$)){4}\b
说明:

  • ^
    字符串的开头
  • 捕获组的开始
  • [A-Z]{3}
    三个大写字符
  • \d{2}
    两位字符
  • 启动或捕获组
    • :|$
      冒号字符或字符串结尾
  • 结束或捕获组
  • {4}
    前面的捕获组的四个实例
  • \b
    字边界,以防止匹配尾随的

    • 这个怎么样?假设您有4个部件,否则将
      {4}
      替换为
      +

      ^([A-Z]{3}\d{2}(:|$)){4}\b
      
      说明:

      • ^
        字符串的开头
      • 捕获组的开始
      • [A-Z]{3}
        三个大写字符
      • \d{2}
        两位字符
      • 启动或捕获组
        • :|$
          冒号字符或字符串结尾
      • 结束或捕获组
      • {4}
        前面的捕获组的四个实例
      • \b
        字边界,以防止匹配尾随的
        • 您可以使用

          ^[A-Z]{3}[0-9]{2}(?::[A-Z]{3}[0-9]{2}){3}$
          
          • ^
            字符串的开头
          • [A-Z]{3}[0-9]{2}
            匹配3次A-Z和2次数字0-9
          • (?:
            非捕获组
            • :[A-Z]{3}[0-9]{2}
              匹配
              3次A-Z和2次数字0-9
          • ){3}
            关闭非捕获组并重复3次
          • $
            字符串结尾
          您可以使用

          ^[A-Z]{3}[0-9]{2}(?::[A-Z]{3}[0-9]{2}){3}$
          
          • ^
            字符串的开头
          • [A-Z]{3}[0-9]{2}
            匹配3次A-Z和2次数字0-9
          • (?:
            非捕获组
            • :[A-Z]{3}[0-9]{2}
              匹配
              3次A-Z和2次数字0-9
          • ){3}
            关闭非捕获组并重复3次
          • $
            字符串结尾

          有时,不使用正则表达式来处理所有内容更容易,而是将一个正则表达式与另一个操作配合使用。在助手过程中,某些类型的验证也更清晰:

          proc ValidateString {input} {
              foreach part [split $input ":"] {
                  # A regular expression is the easiest way of validating the interior pieces
                  if {![regexp {^[A-Z]{3}[0-9]{2}$} $part]} {
                      return false
                  }
              }
              return true
          }
          
          set user_input_1 "AAB22:GHD23:UDJ29:YUD51"
          if {[ValidateString $user_input_1]} {
              puts "Input Criteria Meet"
          } else {
              puts "Input Criteria not meet"
          }
          
          您可以改为使用更复杂的RE,如下所示:

          # ...
          if {[regexp {^[A-Z]{3}[0-9]{2}(:[A-Z]{3}[0-9]{2})*$} $user_input_1]} {
              # ...
          

          但是,除非您切换到扩展形式,否则阅读起来要困难得多,并且缺少命名助手过程的更清晰的助记符,因此我不推荐使用它。

          有时候,不使用正则表达式来处理所有内容,而是将一个正则表达式与另一个操作配合使用会更容易一些。某些类型的验证也比学习者在加入帮助程序时:

          proc ValidateString {input} {
              foreach part [split $input ":"] {
                  # A regular expression is the easiest way of validating the interior pieces
                  if {![regexp {^[A-Z]{3}[0-9]{2}$} $part]} {
                      return false
                  }
              }
              return true
          }
          
          set user_input_1 "AAB22:GHD23:UDJ29:YUD51"
          if {[ValidateString $user_input_1]} {
              puts "Input Criteria Meet"
          } else {
              puts "Input Criteria not meet"
          }
          
          您可以改为使用更复杂的RE,如下所示:

          # ...
          if {[regexp {^[A-Z]{3}[0-9]{2}(:[A-Z]{3}[0-9]{2})*$} $user_input_1]} {
              # ...
          

          但是,除非您切换到扩展形式,否则阅读起来要困难得多,并且缺少命名助手过程的更清晰的助记符,因此我不会真正推荐它。

          尝试
          ^(?[a-Z]{3}\d{2}:)*[a-Z]{3}\d{2}$
          。将光标移到链接处的正则表达式上,以对象化每个正则表达式令牌的描述。您是否已经解决了原始RE的大问题?请尝试
          ^(?[a-Z]{3}\d{2}:)*[a-Z]{3}\d{2}$
          。将光标移到链接处的正则表达式上,以对每个正则表达式标记的描述进行对象化。您是否已经解决了原始RE的大问题?冒号不是特殊字符:不需要转义。这允许在字符串末尾添加一个
          ,并且我们还没有被告知部件编号的实际标准所以最好不要把它放进去。@glennjackman是的,我不知道为什么我逃过了它,虽然它是无害的。@DonalFellows已经用\b修复了。好的catch。冒号不是特殊字符:它不需要逃过。这允许在字符串的末尾有一个
          ,而且我们还没有被告知零件数量的实际标准,所以它是正确的最好不要把它烤进去。@glennjackman是的,我不知道为什么我逃脱了,虽然无害。@DonalFellows已经用\b修复了。很好的捕获。除了使用
          foreach
          循环外,您还可以使用
          lsearch
          检查是否有任何部分不符合标准:
          如果{[lsearch-not-regexp[split$user\u input\u 1:]{^[A-Z]{3}[0-9]{2}$}]<0}{{{0}……
          代替使用
          foreach
          循环,您还可以使用
          lsearch
          检查是否有任何部分不符合标准:
          如果{[lsearch-not-regexp[split$user\u input\u 1:][A-Z]{3}[0-9]{2}}{code}>