i) (XYZ XZZ XVZ XWZ
)
Подсказка: начальная строка X
и Z
конечная строка одинакова для всех пар. Отличается только средняя строка Y Z V W
.
Мое испытание: [regexp {^X([Y|Z|V|W]*)Z$}]
Предполагая, что вы не ставите буквальные скобки вокруг всего лота, вы сопоставляете это, используя следующее:
regexp {X([YZVW])Z} $string -> matchedSubstr
Это потому, что все внутренние строки состоят из одного символа. (Он также сохраняет совпадающую подстроку в переменной matchedSubstr
; выберите там любое имя переменной, которое вы хотите.) Не следует использовать |
внутри []
в регулярном выражении, поскольку оно не имеет там особого значения. (Вам может понадобиться добавить ^$
якорей вокруг внешней стороны.)
С другой стороны, если вы хотите сопоставить несколько последовательностей символов (для которых Y
и т. Д. Просто заменители), вы используете это:
regexp {X(Y|Z|V|W)Z} $string -> matchedSubstr
Обратите внимание, что |
используется здесь , но []
означает , а не .
Если в вашей реальной строке много таких строк (какой бы шаблон вы не использовали для сопоставления), то самый простой способ извлечь их все - с помощью параметров -all -inline
для regexp
, обычно используемых в foreach
как это:
foreach {wholeStr matchedSubstr} [regexp -all -inline {X([YZVW])Z} $string] {
puts "Hey! I found a $matchSubstr in there!"
}
Смешайте и сочетайте по вкусу.
Мое испытание: [regexp {^X([Y]*)Z$}]
или просто регулярное выражение {^XYZ$}
Просто хочу убедиться, что это правильный подход. Есть ли другой способ оптимизировать регулярное выражение:)
Это оптимально для точного сравнения. И на самом деле Tcl оптимизирует это внутренне для теста на равенство строк, если это буквально.