-1

我正在寻找一个正则表达式,它捕获字符串的第一个“和最后一个”之间的所有内容,而不是可能包含更多的“。

$a='"xyz"kljhkljh"lkjhlkj"';
@b=$a=~ m/^"(.*)"$/m;

好像不行?行尾没有\n。

4

3 回答 3

6

你的不工作的原因是你试图限制第一个引号出现在字符串的开头或紧随其中任何地方的换行符之后,最后一个引号出现在字符串的末尾或紧接之前任何地方的换行符。

这不是您的数据包含的内容。不要让这变得比它需要的更难。

如果您想要第一个双引号和最后一个双引号之间的所有内容,包括其他引号,那么您想要

($content)  = $string =~ /"(.*)"/sx;

如果你想要很多,并且里面没有双引号,你想要:

(@contents) = $string =~ /"([^"]*)"/gx;
于 2013-03-09T00:22:46.193 回答
1

在您对 tchrist 的回答的第二条评论中,您说第一个和最后一个引号应该在字符串的开头和结尾?如果是这种情况,您甚至根本不需要正则表达式,只需将整个字符串减去第一个和最后一个字符:

    substr($a, 1, -1)
于 2013-03-09T01:13:09.483 回答
0

出于某种原因,我无法添加评论,所以我正在创建一个答案来回答 bootware 对 tchrist 答案的评论。($content)=$string=~/"(.*)"/sx和之间的区别在于$content=$string=~/"(.*)"/sx前者在列表上下文中匹配,而后者在标量上下文中匹配。在标量上下文中,结果只是一个 1 或 0,指示字符串是否与正则表达式匹配。在列表上下文中,为匹配正则表达式的每个括号部分的子字符串返回一个列表,从左到右的顺序。在这种情况下,正则表达式中有一组括号,因此返回的列表有一个元素,即引号内的字符串部分。

奖励:您可以使用 $1, $2, ... 引用每组括号中匹配的子字符串

于 2013-03-09T01:05:52.417 回答