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;