获取文本单词之间的单词和字符

时间:2017-03-17 19:33:06

标签: regex perl

我有一个文本,例如

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")

除了按字符循环文本字符之外,有没有办法做到这一点?

3 个答案:

答案 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函数并消除空(仅空白)匹配。