正则表达式文字跨度

时间:2010-12-03 14:57:45

标签: regex tcl

有没有办法向正则表达式指明要明确搜索的文本块?我问,因为我必须匹配一个非常长的文本,其中包含各种元字符(和(并且必须完全匹配),然后是一些灵活的东西(足以值得使用正则表达式),然后是更多文本必须完全匹配。

冲洗,重复。

毋庸置疑,我真的不想完成整个事情并且必须逃避每个元字符。这只是让它成为一只熊。有没有办法包装这些部分,以便我不必这样做?

修改

具体来说,我使用的是Tcl,而使用“元字符”,我的意思是有各种各样的长字符串,如“**$^{*$%\)”。我真的不想逃避这些。我的意思是,它会在字符串中添加数千个字符。 Tcl正则表达式是否具有文字跨度元字符?

4 个答案:

答案 0 :(得分:4)

在Tcl中执行此操作的常规方法是使用帮助程序进行转义,如下所示:

proc re_escape str {
    # Every non-word char gets a backslash put in front
    regsub -all {\W} $str {\\&}
}

set awkwardString "**$^{*$%\\)"
regexp "simpleWord *[re_escape $awkwardString] *simpleWord" $largeString

如果你有一个完整的文字字符串,你还有另外两个选择:

regexp "***=$literal" $someString
regexp "(?q)$literal" $someString

然而,这两者都只允许纯文字的模式;你不能用这种方式混合模式和文字。

答案 1 :(得分:0)

不,tcl没有这样的功能。

如果您担心可读性,可以使用变量和命令来构建表达式。例如,您可以执行以下操作:

set fixed1 {.*?[]}  ;# match the literal five-byte sequence .*?[]
set fixed2 {???}    ;# match the literal three byte sequence ???
set pattern "this.*and.*that"

regexp "[re_escape $fixed1]$pattern[re_escape $fixed2]"

您需要提供re_escape的定义,但解决方案应该非常明显。

答案 2 :(得分:0)

可以使用q metasyntactical指令指定Tcl正则表达式,以指示表达式是文字文本:

% set string {this string contains *emphasis* and 2+2 math?}
% puts [regexp -inline -all -indices {*} $string]
couldn't compile regular expression pattern: quantifier operand invalid
% puts [regexp -inline -all -indices {(?q)*} $string]
{21 21} {30 30}

但这适用于整个表达式。

我要做的是迭代返回的索引,使用它们作为[string range]的参数来提取你正在寻找的其他东西。

答案 3 :(得分:-1)

我相信Perl和Java支持\ Q \ E逃脱。所以

\Q.*.*()\E

..实际上会匹配文字“.*.*()

有点破解,但用一些不需要esacping 的文本替换文字部分,并且不会出现在搜索字符串的其他地方。然后使用这个无元字符的文本构建正则表达式。例如,一个100位的随机序列。然后当你的正则表达式在被篡改的字符串中的某个位置和长度匹配时,你可以计算它应该出现在原始字符串中的位置以及它应该是多长。