我期待的字符串有月份前缀,如JAN,FEB,MAR ......
我的正则表达到现在......(J [AU] [NL] | FEB | MA [RY] | APR | AUG | SEP | OCT | NOV | DEC)......
你们可以更短一点,还是有任何不那么难看的选择?
由于
答案 0 :(得分:3)
使用来自in
的{{1}}运算符的不那么丑陋且效率更高的选择。
expr
或
expr {$month in {JAN FEB MAR APR MAY JUN JUL AUG SEP OCT NOV DEC}}
这快一个数量级,看起来更清晰,而且你不会得到任何误报。
正如Donal Fellows所说,如果必须使用正则表达式,最好使用明确的(if {$month in {JAN FEB MAR APR MAY JUN JUL AUG SEP OCT NOV DEC}} {
...
}
),因为它更清楚。现在,我从未冒险进入正则表达式引擎源代码,看它是如何工作的(除非我的一个孩子在那里丢失,否则我也不会),但我很确定引擎的识别链这个表达式的构建至少和你或我想出的任何聪明的缩写一样有效。
另一件事:您是否有可能想要将应用程序国际化?缩写的月份名称在大多数国家/地区是相同的(至少在西方),但存在一些差异。使用Tcl,通过从(JAN|FEB|…|NOV|DEC)
中提取或通过保留自己的列表并使用clock
包,很容易获得缩写月份名称的本地化列表。如果您创建这样的正则表达式:
msgcat
后来有人想要更改应用程序的语言,你只需要重新创建它。如果您想在上面的问题中制作自己的正则表达式,那么这样做会更加困难。