正则表达式 – 如何使用字母顺序搜索带有字母的六个字母的单词

我最近创建了一个Perl脚本,用以下代码搜索以D和E开头的单词:

$infile = 'words.txt';
open(IN,$infile);
$count = 0;
while ($word = <IN>) {
chomp($word);
if ($word =~ /^d\w*e$/i) {
    print "$word\n";
    $count++;
  }
}
print "$count\n";

我最近决定分叉代码并创建一个脚本,搜索一个单词,这个单词是六个字母,单词中的字母是按字母顺序排列的(A到Z).我打算使用位于usr / share / dict / words的Unix标准字典,而不是使用words.txt.如何通过修改此代码来实现此目的?

解决方法

看起来你真正需要的是一种算法,用于检查给定单词中的字母是否按字母顺序排列.有几种方法,但是这个子程序的工作原理是将单词拆分为其组成字符列表,对列表进行排序并重新组合.如果结果与原始单词匹配,则该单词已经排序.

use strict;
use warnings;

use feature 'fc';

for (qw/ a ab ba cab alt effort toffee /) {
  print "$_\n" if in_alpha_order($_);
}

sub in_alpha_order {
  my $word = fc(shift);
  my $new = join '',sort $word =~ /./g;
  return $new eq $word;
}

产量

a
ab
alt
effort

如果你真的想在正则表达式中这样做,你可以建立一个像

a(?=[a-z]) | b(?=[b-z]) | c(?=[c-z]) ...

这是一个以这种方式工作的程序.其输出与上述输出相同.

use strict;
use warnings;

my $regex = join '|',map "${_}(?=[$_-z])",'a'..'z';
$regex = qr/^(?:$regex)*.$/i;

for (qw/ a ab ba cab alt effort toffee /) {
  print "$_\n" if $_ =~ $regex;
}

相关文章

jquery.validate使用攻略(表单校验) 目录 jquery.validate...
/\s+/g和/\s/g的区别 正则表达式/\s+/g...
自整理几个jquery.Validate验证正则: 1. 只能输入数字和字母...
this.optional(element)的用法 this.optional(element)是jqu...
jQuery.validate 表单动态验证 实际上jQuery.validate提供了...
自定义验证之这能输入数字(包括小数 负数 ) &lt;script ...