我正在寻找一个正则表达式,它捕获字符串的第一个“和最后一个”之间的所有内容,而不是可能包含的内容。“
$a='"xyz"kljhkljh"lkjhlkj"';
@b=$a=~ m/^"(.*)"$/m;
似乎不起作用? 在行末端没有\ n。
答案 0 :(得分:6)
你的工作不起作用的原因是你试图将第一个引号限制在字符串的开头或紧接在其中任何地方的新行之后,并且最后一个引号出现在字符串的末尾或紧接在其中任何地方的换行之前。
这不是您的数据所包含的内容。不要让它比它需要的更难。
如果您想要第一个双引号和最后一个引号(包括其他引号)之间的所有内容,那么您需要
($content) = $string =~ /"(.*)"/sx;
如果你想要很多,而且里面没有双引号,你想要:
(@contents) = $string =~ /"([^"]*)"/gx;
答案 1 :(得分:1)
在你对tchrist回答的第二条评论中,你说第一个和最后一个引号应该在字符串的开头和结尾?如果是这种情况,你甚至根本不需要正则表达式,只需要取整个字符串减去第一个和最后一个字符:
substr($a, 1, -1)
答案 2 :(得分:0)
出于某种原因,我无法添加评论,所以我正在创建答案来回答bootware对tchrist答案的评论。 ($content)=$string=~/"(.*)"/sx
和$content=$string=~/"(.*)"/sx
之间的区别在于前者在列表上下文中匹配,后者在标量上下文中匹配。在标量上下文中,结果只是1或0,表示字符串是否与正则表达式匹配。在列表上下文中,按从左到右的顺序返回匹配正则表达式的每个带括号部分的子字符串的列表。在这种情况下,正则表达式中有一组括号,因此返回的列表有一个元素,即引号内的字符串部分。
额外奖励:您可以使用$ 1,$ 2,...来引用每组括号中匹配的子串。