perl Regex用于标识关键字中的字符

omqzjyyz  于 2023-03-30  发布在  Perl
关注(0)|答案(1)|浏览(106)

我想检查构成关键字的1个或多个字符。
因此,如果关键字是“show”,则s、sh、sho或show都符合条件,但所有其他组合都将失败。
我认为前瞻是解决方案,但不确定如何使它们成为可选的,仍然强制要求。
就像...
回显“% s”|perl -ne 'print if /s(?=h)?(?=o)?(?=w)?/'应该打印
回显“sh”|perl -ne 'print if /s(?=h)?(?=o)?(?=w)?/'应该打印
回声“sho”|perl -ne 'print if /s(?=h)?(?=o)?(?=w)?/'应该打印
echo“show”|perl -ne 'print if /s(?=h)?(?=o)?(?=w)?/'应该打印
以及
回声“st”|perl -ne '打印如果/s(?=h)?(?=o)?(?=w)?/'应该失败
回声“停止”|perl -ne 'print if /s(?=h)?(?=o)?(?=w)?/'应该失败
回显“停止”|perl -ne 'print if /s(?=h)?(?=o)?(?=w)?/'应该失败
等等

9w11ddsr

9w11ddsr1#

使用index而不是正则表达式:

perl -nle 'print if index("show", $_) == 0'

-l$_中删除换行符,并在print后添加一行)
如果输入是show的前缀(即,如果输入是show的子字符串,其索引从0开始),则此一行程序将打印输入。
如果你真的需要一个正则表达式,我建议:

/^s(h(ow?)?)?$/

(use如果捕获组的性能很重要,则使用(?:而不是(:它基本上是一样的,除了它没有捕获组)
这种正则表达式应该很容易通过递归函数以编程方式构建:

sub build_re {
  my ($first, $end) = split //, $_[0], 2;
  return $first if $end eq "";
  return "$first(" . build_re($end) . ")?";
}

my $re = build_re("show");  # prints s(h(o(w)?)?)?

print "s" =~ /^$re$/ ? 1 : 0; # 1
print "sh" =~ /^$re$/ ? 1 : 0; # 1
print "show" =~ /^$re$/ ? 1 : 0; # 1

print "showw" =~ /^$re$/ ? 1 : 0; # 0
print "how" =~ /^$re$/ ? 1 : 0; # 0

split2)的3参数告诉split只分割成2个字段,而不是“尽可能多”(默认值)。这样,这个splitbuild_re的输入分割成“第一个字符”和“其余”。它在某种程度上等效于my ($first, $end) = $_[0] =~ /^(.)(.*)$/(假设输入在一行上)。

相关问题