【问题标题】:TCL Regexp for extracting months from a stringTCL Regexp 用于从字符串中提取月份
【发布时间】:2015-01-18 06:13:17
【问题描述】:

我期待具有月份前缀的字符串,例如 JAN、FEB、MAR...

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

你们能不能再短一点,或者有什么不那么难看的选择吗??

谢谢

【问题讨论】:

  • 正则表达式将匹配JAL
  • 我的错!!请在不包括 JAL 之类的垃圾值的情况下缩短时间
  • 我不希望我的字符串中有 JAL,所以你可以把它当作一个例外......
  • 我只是逐字逐句列出它们 ((JAN|FEB|…|NOV|DEC)),因为 RE 编译器会很容易地整理出混乱,并且意图描述的清晰度比试图使 RE 文本更短更好尽可能。

标签: regex tcl


【解决方案1】:

不那么难看但效率更高的替代方法是使用来自exprin 运算符。

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}] |])

后来有人想更改应用程序的语言,您只需重新创建它。如果您想像上面的问题那样制作自己的正则表达式,这样做会困难得多。

【讨论】:

  • 我的字符串比你想象的要大,这些前缀只是其中的一小部分,一个字符串只包含一个月前缀。
  • @AnilBisht:不清楚您需要什么,无论是您的问题还是您的评论。唯一可以肯定的是,缩短搜索表达式不会改善您的程序。它不会更可靠、更快或更容易维护。总是喜欢理智的解决方案而不是聪明的解决方案。
  • 非常感谢@Hoodicrow 的建议。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-02-12
  • 2020-09-18
  • 2022-08-03
  • 1970-01-01
  • 2013-08-09
  • 2013-10-01
  • 1970-01-01
相关资源
最近更新 更多