gpt4 book ai didi

regex - 如何从perl中的字符串中提取2个以上字符的单词

转载 作者:行者123 更新时间:2023-12-02 01:40:32 26 4
gpt4 key购买 nike

我假设某种正则表达式可以用来完成这个任务?

我需要获取每个单词由 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;

我进行了排序和小写以匹配问题中的示例代码,但所有处理都是使用字符串中文件内容的显示正则表达式完成的。

输出如预期(除了这里的lineworld出现了两次,什么是正确的)。

请注意,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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com