我需要匹配最长的匹配数字串。
例如:
全名: 2389466849
我需要匹配:
23894
或
2389
如果我想确保我只获得最长的匹配,我该如何做到这一点?最好用正则表达式还是以其他方式完成?
请举例。
答案 0 :(得分:0)
如果您正在寻找使用部分匹配来获取完整数字,请使用:
# 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
答案 1 :(得分:0)
正则表达式无法描述您的问题类型。可能有一些正则表达式工具具有可以解决您的问题的其他功能,但如果您想使用一个只能找到正则表达式描述的字符串的工具,那是不可能的。你的问题需要计算。
答案 2 :(得分:0)
使用posix基本正则表达式(即使用grep
),使用23894?
或23894\|2389
。使用posix扩展正则表达式(grep -E
):23894|2389
Posix正则表达式(与其他一些变体不同)始终匹配从最早可能起点开始的可能性中的最长匹配。
最早的起点规则意味着如果你的目标是:
23890000023894
匹配23894?
将与之前的2389
匹配,因此它不是严格匹配最长的匹配。如果你需要字符串中任何地方的最长匹配,那就有点棘手了。
答案 3 :(得分:0)
这就是我的想法。
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合作。