如何使用正则表达式匹配最长的字符串

时间:2013-10-08 17:44:16

标签: regex linux bash

我需要匹配最长的匹配数字串。

例如:

全名: 2389466849

我需要匹配:

23894

2389

如果我想确保我只获得最长的匹配,我该如何做到这一点?最好用正则表达式还是以其他方式完成?

请举例。

4 个答案:

答案 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合作。