来自以下文字......
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中?
谢谢。
答案 0 :(得分:0)
使用非捕获括号:
^(.+) (\d{5})(?:\t| )(.+)$
答案 1 :(得分:0)
你想:
^(.+?) (\d{5})[\t ](.+)$
由于您匹配一个字符或另一个字符,因此您可以使用字符类。另外,我让你的第一个量词非贪婪(+?
而非+
),以减少引擎发现匹配的回溯量。
通常,如果您想让捕获组不捕获任何内容,可以向其添加?:
,例如:
^(.+?) (\d{5})(?:\t| )(.+)$
答案 2 :(得分:0)
一种方法是使用\s
代替( |\t)
,它将匹配任何空白字符。
请参阅Backslash-sequences了解Perl如何定义“空白”。