Менее некрасиво, и гораздо более эффективной, альтернативой является использование оператора in
из expr
.
expr {$month in {JAN FEB MAR APR MAY JUN JUL AUG SEP OCT NOV DEC}}
или
if {$month in {JAN FEB MAR APR MAY JUN JUL AUG SEP OCT NOV DEC}} {
...
}
Это на порядок быстрее, яснее смотреть, и вы не получите каких-либо ложных срабатываний.
Как Донал стипендиатов заметки, если нужно использовать регулярное выражение, то лучше использовать явный один ((JAN|FEB|…|NOV|DEC)
), так как это более ясно. Теперь я никогда не осмеливался в исходном коде двигателя регулярных выражений, чтобы увидеть, как он работает (и я бы не остался там, где был один из моих детей), но я уверен, что цепи распознавания, которые двигатель создает для этого выражения по крайней мере так же эффективны, как и любая умная аббревиатура, которую вы или я могли бы придумать.
Другое дело: есть ли вероятность, что вы можете интернационализировать приложение? Названия сокращенных месяцев одинаковы в большинстве стран (по крайней мере, на Западе), но есть некоторые различия. С Tcl очень легко получить локализованные списки сокращенных имен месяцев либо путем извлечения их из clock
, либо путем хранения ваших собственных списков и использования пакета msgcat
. При создании регулярного выражения, как это:
set re ([join [lmap m {0 1 2 3 4 5 6 7 8 9 10 11} {lindex [::msgcat::mc MONTHS_ABBREV] $m}] |])
, а потом кто-то хочет изменить язык приложения, вы просто создать его повторно. Это гораздо сложнее сделать, если вы хотите создавать свои собственные регулярные выражения, как в своем вопросе выше.
Регулярное выражение будет соответствовать 'JAL'. – falsetru
MY плохой !!. пожалуйста, уходите короче, не считая значений мусора, таких как JAL –
'J (?: AN | U [NL])' –