用于从字符串中提取月份的 TCL 正则表达式

TCL Regexp for extracting months from a string

我希望字符串具有月份前缀,例如 JAN、FEB、MAR...

我的正则表达式到现在...(J[AU][NL]|FEB|MA[RY]|APR|AUG|SEP|OCT|NOV|DEC)...

你们能不能再短一点或者有没有更丑的选择??

谢谢

更简洁、更高效的替代方法是使用 expr 中的 in 运算符。

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

速度快了一个数量级,看起来更清晰,而且您不会得到任何误报。


正如 Donal Fellows 指出的那样,如果必须使用正则表达式,最好使用显式 ((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}] |])

后来有人要更改应用程序的语言,您只需re-create即可。如果您想像上面的问题一样制作自己的正则表达式,那么这样做会困难得多。