【发布时间】:2019-11-21 15:48:33
【问题描述】:
我想知道是否有一种简单的方法可以检查一个字符串是否是 bash 中另一个字符串的子序列,实际上是一个带有额外规则的子序列。我会解释的。
“apple”的一些子序列是“aple”、“al”、“pp”和“ale”。我想得到的带有额外规则的子序列是那些以与字符串相同的字母开头和结尾的子序列,所以只有“aple”和“ale”符合我的愿望。
我做了以下程序:
#!/bin/bash
while read line
do
search=$(echo "$line" | tr -s 'A-Za-z' | sed 's/./\.\*&/g;s/^\.\*//' )
expr match "$1" "$search" >/dev/null && echo "$line"
done
执行如下:
./program.sh greogdgedlqfe < words.txt
这个程序可以运行,但是速度很慢。
它获取文件的每一行,将其修改为正则表达式,然后检查它们是否匹配,然后打印原始行。比如:
其中一行包含 google
$search 变成 g.*o.*g.*l.*e (重复的字母被压缩,额外的规则)
然后我们使用给定的参数检查该表达式,如果匹配,我们打印以下行:google
这工作正常,但是当文件 words.txt 变得太大时,这个程序变得太慢。我怎样才能加快我的程序,可能通过更快的匹配子序列。
在可能的 Kamilcuk 解决方案后编辑
该解决方案为字符串“qwertyuihgfcvbnhjk”返回 quick,quiff,quin,qwerty,并且只应返回 quick,所以它几乎是正确的,但还不完全正确。
【问题讨论】:
-
你能从 words.txt 和示例输出中发布一些摘录吗?我无法测试您的脚本,某些匹配和不匹配某些输入的单词会有所帮助。
apppppppple是apple的子序列吗?因为你的脚本会匹配到apple。 -
如果我理解正确的话,
apple的有效后续只有 4 个:aealeapeaple。对吗? -
是的,但 apppppppppppe 也会在我的程序中匹配,这是有意的。
-
哦?那么
a<anythinghere>pple也是苹果的后续吗? “后续”看起来不像“子序列”,而是像扩展。所以一个子序列就是任何与正则表达式匹配的东西,由一个单词的字母组成,字母之间有.*,故事结束了吗? -
不,appppe 是苹果的后续,因为我的程序首先挤压重复的字符。所以appppe变成了猿,这是苹果的后续。
标签: bash performance subsequence