2011-04-21 110 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