如何区分保存的段和替代?

时间:2011-09-04 14:51:02

标签: regex

来自以下文字......

Acme Inc.<SPACE>12345<SPACE or TAB>bla bla<CRLF>

...我需要提取公司名称+邮政编码+其余部分。

由于TAB或SPACE字符可以将第二个标记与第三个标记分开,我尝试使用以下正则表达式:

FIND:^(.+) (\d{5})(\t| )(.+)$
REPLACE:\1\t\2\t\3

但是,替代部分的内容放在\ 3部分,结果如下:

Acme Inc.<TAB>12345<TAB><TAB or SPACE here>$

如何告诉(Perl)正则表达式引擎(\ t |)是替代而不是将令牌保存在RAM中?

谢谢。

3 个答案:

答案 0 :(得分:0)

使用非捕获括号:

^(.+) (\d{5})(?:\t| )(.+)$

答案 1 :(得分:0)

你想:

^(.+?) (\d{5})[\t ](.+)$

由于您匹配一个字符或另一个字符,因此您可以使用字符类。另外,我让你的第一个量词非贪婪(+?而非+),以减少引擎发现匹配的回溯量。

通常,如果您想让捕获组不捕获任何内容,可以向其添加?:,例如:

^(.+?) (\d{5})(?:\t| )(.+)$

答案 2 :(得分:0)

一种方法是使用\s代替( |\t),它将匹配任何空白字符。

请参阅Backslash-sequences了解Perl如何定义“空白”。