我需要将数字字符串与最长的匹配项进行匹配。
例如:
完整号码:2389466849
我需要匹配:
23894
或者
2389
如果我想确保我只获得最长的匹配,我该怎么做?这最好用正则表达式还是以其他方式完成?
请举例。
如果您正在寻找通过使用部分匹配来获取完整号码,请使用:
# 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
正则表达式无法描述您的问题类型。可能有一些具有附加功能的正则表达式工具可以解决您的问题,但是如果您想使用一个只能找到正则表达式描述的字符串的工具,那是不可能的。您的问题需要计算。
使用 posix 基本正则表达式(即 with grep
),使用23894?
or 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 ]]
and echo
。
我真的觉得应该有一种更有效的方法来做到这一点,但你只是在使用 Bash。