Используйте Regexp для сопоставления определенного повторяющегося ввода строки шаблона в TCL - PullRequest
0 голосов
/ 09 июля 2020
• 1000 *

Я попробовал следующее регулярное выражение, но оно не работает.

# 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"
}

Ответы [ 4 ]

3 голосов
/ 09 июля 2020

Как насчет этого? Предполагая, что у вас есть 4 части, в противном случае замените {4} на +.

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

Пояснение:

  • ^ Начало строки
  • ( Начало группы захвата
  • [A-Z]{3} Три прописных символа
  • \d{2} Два символа di git
  • ( Начало группы захвата ИЛИ
    • :|$ Двоеточие ИЛИ конец строки
  • ) Конец группы захвата ИЛИ
  • {4} Четыре экземпляра предыдущей группы захвата
  • \b Граница слова для предотвращения совпадения конечного :.
0 голосов
/ 09 июля 2020

Иногда проще не использовать регулярное выражение для всего, а вместо этого использовать его вместе с другой операцией. Некоторые типы проверки также намного понятнее, если они помещены во вспомогательную процедуру:

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]} {
    # ...

но это значительно труднее читать, если вы не переключитесь на расширенную форму, и в ней отсутствует более четкая мнемоника именованной вспомогательной процедуры, поэтому я бы не рекомендовал ее.

0 голосов
/ 09 июля 2020

Вы можете использовать

^[A-Z]{3}[0-9]{2}(?::[A-Z]{3}[0-9]{2}){3}$
  • ^ Начало строки
  • [A-Z]{3}[0-9]{2} Соответствие 3 раза AZ и 2 раза di git 0-9
  • (?: Группа без захвата
    • :[A-Z]{3}[0-9]{2} Сопоставьте : 3 раза AZ и 2 раза di git 0-9
  • ){3} Закройте группу без захвата и повторите 3 раза
  • $ Конец строки

Regex demo

0 голосов
/ 09 июля 2020

Я пробовал следующее, и оно работает.

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