Regex 如何使用正则表达式匹配可能最长的字符串
我需要将数字串与尽可能长的匹配项进行匹配 例如: 全数: 2389466849 我需要与以下各项相匹配: 23894 或 2389 如果我想确保我只获得尽可能长的比赛,我如何才能做到这一点?这最好用正则表达式还是用其他方法来实现Regex 如何使用正则表达式匹配可能最长的字符串,regex,linux,bash,Regex,Linux,Bash,我需要将数字串与尽可能长的匹配项进行匹配 例如: 全数: 2389466849 我需要与以下各项相匹配: 23894 或 2389 如果我想确保我只获得尽可能长的比赛,我如何才能做到这一点?这最好用正则表达式还是用其他方法来实现 请举例说明。如果您希望通过部分匹配获取完整数字,请使用: # all possible partial matching/non-matching strings arr=( 23894 2389 2388 238946 ) # convert them into r
请举例说明。如果您希望通过部分匹配获取完整数字,请使用:
# all possible partial matching/non-matching strings
arr=( 23894 2389 2388 238946 )
# convert them into regex
s=$(printf "%s|" ${arr[@]} | sed 's/|$//')
# find longest matching pattern in input
egrep -o "$s" <<< "2389466849"
238946
#所有可能的部分匹配/非匹配字符串
arr=(238942389238946)
#将它们转换为正则表达式
s=$(printf“%s |”${arr[@]}| sed's/|$/'))
#查找输入中最长的匹配模式
egrep-o“$s”正则表达式无法描述您的问题类型。可能有一些正则表达式工具具有其他功能,可以解决您的问题,但如果您想使用一个工具,它实际上只能查找正则表达式描述的字符串,这是不可能的。你的问题需要计算 对于posix基本正则表达式(即grep
),使用23894?
或23894\| 2389
。使用posix扩展正则表达式(grep-E
):23894 | 2389
Posix正则表达式(与其他一些变体不同)总是匹配从尽可能早的起点开始的一组可能性中最长的匹配
最早的起点规则意味着如果您的目标是:
23890000023894
匹配的23894?
将匹配较早的2389
,因此严格来说它不是最长的匹配。如果您需要字符串中任何位置的最长匹配,这就有点棘手了。以下是我的想法
regexes=( 23894 2389 )
test=2389466849
tmp=( )
for reg in ${regexes[@]}; do if [[ $test =~ $reg ]]; then
tmp=( ${tmp[@]} $reg ); fi; done
maxlen=0
for match in ${tmp[@]}; do if [[ ${#match} > $maxlen ]]; then
maxlen=${#match}; fi; done
基于此,您将知道匹配的最长子字符串。如果需要,也可以使用与上一个循环类似的循环打印出来,但要使用[${{match}=$maxlen]
和echo
我真的觉得应该有一种更有效的方法来实现这一点,但您只是在使用Bash。我需要做相反的事情。我需要根据完整数字查找短版本的最长匹配项。请提供一个示例。完整数字:2389466849-如果有多个潜在匹配项,我需要查找与此数字匹配的最长部分字符串,例如23894、2389和238。我需要能够确定23894是给定选项的最长匹配。因此,您的输入是一组字符串a和字符串b。作为输出,您需要A中最长的字符串,这是b的子字符串,对吗?相反,字符串b是字符串aAs的子字符串,我理解,在给定的文本中:“123456789”,如果搜索“23467”,您想返回“234”,对吗?