2011-09-04 22 views
0

從下面的文字...如何區分保存的細分和替代?

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

...我需要提取的公司名稱+郵編+行的其餘部分。

由於無論是TAB或空格字符可以分離從所述第三令牌的第二,我嘗試使用以下正則表達式:

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

然而,替代部分的內容被放入\ 3部分,所以結果是這樣的:

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

我怎麼能告訴(Perl的)正則表達式引擎(\ T |)是一種替代,而不是被保存在RAM中的令牌?

謝謝。

回答

0

你想:

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

既然你匹配一個字符或其他的,你可以使用一個字符類代替。另外,我讓你的第一個量詞不貪心(+?而不是+),以減少引擎找回匹配的回溯量。

一般來說,如果你想捕捉組無法捕捉到任何東西,你可以添加?:給它,如:

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

很高興知道。謝謝你的提示 – Gulbahar

0

使用非捕獲括號:

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

一種方法是使用\s代替(|\t)將匹配任何空白焦炭。

請參閱Backslash-sequences瞭解Perl如何定義「空白」。