我想检查构成关键字的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)?/'应该失败
等等
1条答案
按热度按时间9w11ddsr1#
使用
index
而不是正则表达式:(
-l
从$_
中删除换行符,并在print
后添加一行)如果输入是
show
的前缀(即,如果输入是show
的子字符串,其索引从0
开始),则此一行程序将打印输入。如果你真的需要一个正则表达式,我建议:
(use如果捕获组的性能很重要,则使用
(?:
而不是(
:它基本上是一样的,除了它没有捕获组)这种正则表达式应该很容易通过递归函数以编程方式构建:
split
(2
)的3参数告诉split
只分割成2个字段,而不是“尽可能多”(默认值)。这样,这个split
将build_re
的输入分割成“第一个字符”和“其余”。它在某种程度上等效于my ($first, $end) = $_[0] =~ /^(.)(.*)$/
(假设输入在一行上)。