我有一个文本,例如
my $text = "share your knowledge, Q&A-style"
并希望在列表中获得和之间的字符。如果我使用
my (@parts) = $text =~ /(\w+)/g
我得到了
("share", "your", "knowledge", "Q", "A", "style")
现在我想得到以下列表:
("share", "your", "knowledge", ",", "Q", "&", "A", "-", "style")
除了按字符循环文本字符之外,有没有办法做到这一点?
答案 0 :(得分:5)
通过使用split
并将正则表达式放在括号中,它也将返回分隔符。然后使用grep
:
use strict;
use warnings;
my $text = "share your knowledge, Q&A-style";
my @parts = grep { /\S/ } split /(\w+)/, $text;
答案 1 :(得分:3)
如果你编写一个正则表达式来匹配 一系列“单词”字符或一系列非单词非空格字符,这非常简单< / p>
use strict;
use warnings 'all';
my $text = "share your knowledge, Q&A-style";
my @parts = $text =~ /\w+|[^\w\s]+/g;
use Data::Dumper;
$Data::Dumper::Terse = 1;
$Data::Dumper::Useqq = 1;
print Dumper \@parts;
[
"share",
"your",
"knowledge",
",",
"Q",
"&",
"A",
"-",
"style"
]
唯一的差异是您的示例输出在知识之后显示元素", "
(带空格)。我猜这是一个错误,因为所有其他空格都被丢弃了,但是如果你真的想要捕获跟随非单词序列的任何空格,那么你只需要将正则表达式模式改为$text =~ /\w+|[^\w\s]+\s*/g
答案 2 :(得分:-1)
要获得您想要的匹配,您应该使用这样的正则表达式\b(?:\S|\S+?\s+?)+?\b
example
它将匹配任何非空白字符集或非空白字符后跟空格(以考虑您的&#34;,&#34;条件)。
我认为您可能还想在单词结尾处查看split
函数并消除空(仅空白)匹配。