2011-04-21 164 views
5

所以我认为这只是一个简单的问题,但是我得到的结果不正确。基本上我试图删除字符串周围的引号。比如我有字符串“01:00”,我想01:00,下面是如何,我想我将能够做到这一点的代码:删除字符串中的引号

$expected_start_time = $conditions =~ m/(\"[^\"])/; 

这个运行时,它会返回1每一次,所以我猜测它只是返回true而不是实际从引号中提取字符串。这一点无论是什么引号“02:00”,“02:20”,“08:00”等

回答

13

所有你忘记的是LHS把匹配放入列表上下文的所有元素,所以它返回了子匹配组。正常的方式来做到这一点是:

($expected_start_time) = $condition =~ /"([^"]*)"/; 
4

蛮力的方法是:

$expected_start_time = $conditions; 
$expected_start_time =~ s/"//g; 

而且,原正则表达式:

m/(\"[^\"])/ 

会捕获开局报价和下面的非引用字符。为了捕捉双引号之间的非引号字符,你需要一些变种:

m/"([^"]*)"/; 

这是Perl的(和正则表达式),TMTOWTDI - 有一个以上的方式做到这一点。

+0

你的意思是s/\“/ g吧? – Brandon 2011-04-21 14:39:21

+4

布兰登:'''不是特殊字符,不需要引用,尽管这样做没有任何伤害。 – 2011-04-21 14:41:15

+3

@Brandon:不 - 我的意思是我写的。在正则表达式中,引号没有特殊含义。 – 2011-04-21 14:43:23

1

在标量上下文中,如果正则表达式匹配字符串,则返回true。您可以通过$1访问比赛。见perlre

9

看来,你知道第一个和最后一个字符是引号,所以使用

$expected_start_time = substr $conditions, 1, -1; 

无需使用正则表达式。

+0

所以有人低估了我。请解释一下? – 2013-03-17 16:25:35

+1

这应该是被接受的答案。为什么这会得到低投票?它不比=〜正则表达式更高效吗?无论如何,它的工作和感觉更清醒,所以从我投票 – roothahn 2018-02-23 18:06:44