2011-05-19 111 views
0

我有这样的一帮行:绑定变量的正则表达式

John Smith 
Jane Doe 
Dr. Bruce Wayne 

,我想提出的名称到CSV文件中有两列:title和全名。 我正在使用这个正则表达式:/(\w*\.)?(.*)/,然后我打印"$1;$2"。问题在于,在没有标题的名称中,perl抱怨未初始化的值为$ 1。我如何使它只是使用空字符串?

+2

这没有任何意义,或者你的正则表达式匹配,那么'$ 1'和'$ 2'都是绑定的,或者它没有绑定,那么它们都没有绑定。 (好吧,$ 1可能与你以前使用的正则表达式绑定在一起,但这是一个无关紧要的值,并不比未定义的更好)。无论如何,如果匹配失败,你不应该使用'$ 1' *或*'$ 2'! m42的答案显示了如何使正则表达式始终匹配。 – 2011-05-19 14:31:41

+0

@Kilian:我知道,在第一组之后我忘了一个'?'。我仍然不得不放置'|'来使其工作。 – 2011-05-19 16:06:27

+0

你会错过“马丁路德金牧师”的称号。和“Suess医生”...... – tadmc 2011-05-20 01:10:28

回答

7

只要改变你的正则表达式:

my $re = qr/(\w*\. |)(.*)/; 
add alternation --^ 
4

一般来说,如果有必要做一个匹配的部分可选的使用,在(?: )组?只是使用?捕获组后,会离开民主基金,如果省略了捕获变量,但您可以使用非捕获组捕获组内:

/((?:\w*\.)?)(.*)/;