从字符串中去除引号

7

所以我认为这只是一个简单的问题,但是我得到了错误的结果。基本上,我正在尝试删除字符串周围的引号。例如,我有字符串"01:00",我想要的是01:00,下面是我认为我能够完成此操作的代码:

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

每次运行它都会返回1,所以我猜它只是返回true而没有实际从引号中提取字符串。无论引号中是什么,如“02:00”,“02:20”,“08:00”等。

大多数引用都提供了转义的方法(例如 \"),有时甚至还提供特殊的转义(例如 \x20)。但是这些解决方案都没有处理这个问题,因此它们都不太可能正确。但是您没有提供足够的信息来做得更好。 - ikegami
4个回答

15

你忘记在左手边加上圆括号将匹配结果放入列表环境中,以返回子匹配组。通常的做法是:

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

15

看起来你知道第一个和最后一个字符是引号。如果是这样的话,使用

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

不需要使用正则表达式。


1
这应该是被接受的答案。为什么会被踩?它不是比 =~ 正则表达式更高效吗?无论如何,它能够工作并且感觉更加稳健,所以我投赞成票。 - sgohl

5
粗暴的方法是:
$expected_start_time = $conditions;
$expected_start_time =~ s/"//g;

请注意,原始的正则表达式:
m/(\"[^\"])/

要捕获开头引号和其后的非引号字符。要捕获双引号之间的非引号字符,您需要使用某种变体:

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

这是Perl(和正则表达式)的特点,TMTOWTDI - 有不止一种方法来做它。

4
布兰登说:"不是特殊字符,不需要加引号,但这样做也没有坏处。 - Christoffer Hammarström
3
@Brandon: 不,我的意思就是我写的那样。在正则表达式中,引号没有特殊含义。 - Jonathan Leffler
但是用反斜杠转义所有非字母数字字符并没有什么坏处。即使不需要,我经常这样做,这样一眼就能看出它不是元字符。 - shawnhcorey

1
在标量上下文中,如果正则表达式与字符串匹配,则返回 true。您可以使用 $1 访问匹配项。请参见 perlre

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接