2015-01-18 2 views
0

Я ожидающая строку, которые есть месяц как JAN указан префикс, ТЭБ, MAR ...TCL Regexp для извлечения месяцев из строки

Моего регулярного выражения до сих пор ... (J [AU] [NL] | ТЭБ | MA [RY] | APR | AUG | SEP | OCT | NOV | DEC) ...

Можете ли вы, ребята, уйти короче или есть какая-то менее уродливая альтернатива?

Благодаря

+0

Регулярное выражение будет соответствовать 'JAL'. – falsetru

+0

MY плохой !!. пожалуйста, уходите короче, не считая значений мусора, таких как JAL –

+0

'J (?: AN | U [NL])' –

ответ

3

Менее некрасиво, и гораздо более эффективной, альтернативой является использование оператора 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}] |]) 

, а потом кто-то хочет изменить язык приложения, вы просто создать его повторно. Это гораздо сложнее сделать, если вы хотите создавать свои собственные регулярные выражения, как в своем вопросе выше.

+0

Мои строки больше, чем вы думаете, и этот префикс - лишь малая его часть, а одна строка будет содержать только один префикс месяца. –

+4

@AnilBisht: неясно, что вам нужно, ни от вашего вопроса, ни от вашего комментария здесь. Единственное, что можно сказать с какой-либо определенностью, состоит в том, что сокращение выражения поиска не улучшит вашу программу. Он не будет более надежным, быстрым или более легким в обслуживании. Всегда предпочитайте разумное решение умному. –

+0

Большое спасибо @Hoodicrow за ваше предложение. –

Смежные вопросы