String 创建由“+”和“-”分隔的文本列表

String 创建由“+”和“-”分隔的文本列表,string,perl,String,Perl,我有一个以下方式的文本 @@+aaa+bbb+ccc-asd-asdfg+hhh 我需要将文本分为两个列表: 那些以+开头的单词:“aaa”,“bbb”,“ccc”,“hhh” 以-:“asd”、“asdfg”开头的 我做了$str=substr$str,2;要删除@.-.我将使用+或-分割字符串,并将每个元素存储在数组中: #!/usr/bin/perl use warnings; use strict; use feature qw/ say /; my $text = '@@+aaa+

我有一个以下方式的文本

@@+aaa+bbb+ccc-asd-asdfg+hhh
我需要将文本分为两个列表:

那些以+开头的单词:“aaa”,“bbb”,“ccc”,“hhh” 以-:“asd”、“asdfg”开头的 我做了$str=substr$str,2;要删除@.-.

我将使用+或-分割字符串,并将每个元素存储在数组中:

#!/usr/bin/perl
use warnings;
use strict;
use feature qw/ say /;

my $text = '@@+aaa+bbb+ccc-asd-asdfg+hhh';

my @words = split(/[+-], $text);

shift @words if $words[0] =~ /^@/;

say for @words;

您可以使用2个正则表达式来获取除-和+之后-和+之外的所有字符:


在这里,\+匹配一个literal+,而-matches一个literal-,然后\K从匹配中省略这个符号,[^+-]+匹配并返回一个1+字符块,而不是-和+。

为什么不使用/[@+-]/甚至/\W+/?很抱歉,遗漏了这一点。我需要在“单独的列表”之前加上“+”元素,而在“单独”列表中前面的“我”的答案如下。如果你不知道Perl,那么这是错误的开始学习的地方,你不能认为堆栈溢出是自由软件解决方案的来源。然而,在这方面有许多链接会有所帮助。请仔细阅读。这在文本为+aaa+bbb的情况下不起作用+ccc@Anyone谁有机会看到上面的评论,请参见OP的问题:我需要在单独的列表中元素前面加“+”,在单独的列表中元素前面加“-”。关于您的更新,是的,它会生成所需的输出。但谁说在弦的开头只有at符号?如果您只使用这一个示例,那么您可以编写say for qw/aaa bbb ccc asd asdfg hhh//[+-]/比/\+-/更干净一点,OP对substr$、0、2感到满意,因此即使是无条件的shift@words应该可以。不幸的是,OP编辑了他的问题,所以这不再是正确的。
#!/usr/bin/perl
use warnings;
use feature 'say';

my $text = "@@+aaa+bbb+ccc-asd-asdfg+hhh";

my @lstplus = $text =~ /\+\K[^+-]+/g;
my @lstminus = $text =~ /-\K[^+-]+/g;