Tcl将正则表达式拆分为多行



我有一个很长的RE来匹配多个文件中的日期,我想把它分成多行,这样更容易阅读和更新。我将其设置为一个变量,然后在regex语句中调用该变量。

set ::eval::regexdate { d[/.-]d{2}[/.-]d{4}|d{2}[/.-]d{2}[/.-]d{4}|d{4}[/.-]d{2}[/.-]d{2}|(([12]d|3[01])|([12]d|3[01])(th|nd|rd|st))s(January|February|March|April|May|June|July|August|September|October|November|December)sd{4}|(JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC)[/.-]d{2}[/.-]d{4} }

然后我用下面的regexp行调用它。。。

if {[regexp "($::eval::regexdate)" $linefromfile all date]} {
Do something...
}

如果RE被设置为一个长字符串,这一切都很好,但如果我试图使用(?x(将其分解为多行,如本文所述。

跨多行的regexp模式

set ::eval::regexdate {(?x)
d[/.-]d{2}[/.-]d{4}|
d{2}[/.-]d{2}[/.-]d{4}|
d{4}[/.-]d{2}[/.-]d{2}|
(([12]d|3[01])|([12]d|3[01])(th|nd|rd|st))s(January|February|March|April|May|June|July|August|September|October|November|December)sd{4}|
(JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC)[/.-]d{2}[/.-]d{4}
}

我得到以下错误。。。

`couldn't compile regular expression pattern: quantifier operand invalid.`

我不确定为什么会发生这种情况,我的理解是,使用(?x(会忽略所有空白和注释,所以它应该将线条重新缝合在一起,以创建一个长RE,不是吗?是"|"操作数导致问题,就像我拆分RE一样?

如果有任何帮助,我们将不胜感激,以找出为什么使用(?x(时它不起作用。

感谢

问题在于您在regxep命令中使用regexdate变量的方式。正如您引用的post所示,(?x)应该位于正则表达式的开头。但是,通过使用"($::eval::regexdate)",可以在其周围加上括号,从而有效地生成表达式((?x)…)。在完整的正则表达式周围放圆括号并不是很有用,因为regexp命令已经将完全匹配项放在了交给它的第一个变量中

因此,可以省略括号,使用完全匹配的日期:

regexp $::eval::regexdate $linefromfile date

或者将(?x)移动到呼叫:

set ::eval::regexdate {
d[/.-]d{2}[/.-]d{4}|
d{2}[/.-]d{2}[/.-]d{4}|
d{4}[/.-]d{2}[/.-]d{2}|
(([12]d|3[01])|([12]d|3[01])(th|nd|rd|st))s(January|February|March|April|May|June|July|August|September|October|November|December)sd{4}|
(JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC)[/.-]d{2}[/.-]d{4}
}
if {[regexp "(?x)($::eval::regexdate)" $linefromfile all date]} {
Do something...
}

最新更新