- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我假设某种正则表达式可以用来完成这个任务?
我需要获取每个单词由 2 个或更多字符组成的位置,以字母开头,其余字符由字母、数字和下划线组成。
这是我当前拥有的代码,尽管它与我想要的输出不太接近:
while (my $line=<>) {
# remove leading and trailing whitespace
$line =~ s/^\s+|\s+$//g;
$line = lc $line;
@array = split / /, $line;
foreach my $a (@array){
$a =~ s/[\$#@~!&*()\[\];.,:?^ `\\\/]+//g;
push(@list, "$a");
}
}
示例输入为:
#!/usr/bin/perl -w
use strict;
# This line will print a hello world line.
print "Hello world!\n";
exit 0;
所需的输出将是(按字母顺序):
bin
exit
hello
hello
line
perl
print
print
strict
this
use
usr
will
world
最佳答案
my @matches = $string =~ /\b([a-z][a-z0-9_]+)/ig;
如果只需要对子模式应用不区分大小写的操作,可以embed it
/... \b((?i)[a-z][a-z0-9_]+) .../
(或者,可以在子模式之后关闭,(?i)pattern(?-i)
)
[a-zA-Z0-9_]
为 \w
,一个“单词字符”,如果这确实是这样的话是需要的。
上面的正则表达式根据需要选择单词,而不需要首先在空格上分割行,在所示的程序中完成。可以将其应用于整行(或整个文本),也许是在显示的各种特殊字符的剥离之后。†
还有一些其他情况的问题——连字符怎么样?撇号?波浪号?这些在标识符中找不到,虽然这似乎是为了处理编程文本,但包括注释;可能还有哪些其他合法字符?
关于 split 的注释- 空白处
显示的 split//, $line
恰好在该一个空格上拆分。更好的是 split/\s+/, $line
- 或者,更好的是使用 split
的特殊模式 split ' ', $line
>:分割任意数量的连续空格,并且前导空格和尾随空格被丢弃。
† 仅通过给定的正则表达式即可正确处理所示示例
use strict;
use warnings;
use feature 'say';
use Path::Tiny qw(path); # convenience, to slurp the file
my $fn = shift // die "Usage: $0 filename\n";
my @matches = sort map { lc }
path($fn)->slurp =~ /\b([a-z][a-z0-9_]+)/ig;
say for @matches;
我进行了排序和小写以匹配问题中的示例代码,但所有处理都是使用字符串中文件内容的显示正则表达式完成的。
输出如预期(除了这里的line
和world
出现了两次,什么是正确的)。
请注意,lc
可以应用于包含文件内容的字符串,然后使用正则表达式进行处理,效率更高。虽然原则上这与本例中的情况不同,但可能是
perl -MPath::Tiny -wE'$f = shift // die "Need filename\n";
@m = sort lc(path($f)->slurp) =~ /\b([a-z]\w+)/ig;
say for @m'
这里我实际上使用了\w
。如果不同,请调整为实际字符以匹配。
关于regex - 如何从perl中的字符串中提取2个以上字符的单词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71644688/
我是一名优秀的程序员,十分优秀!