0

我需要将数字字符串与最长的匹配项进行匹配。

例如:

完整号码:2389466849

我需要匹配:

23894

或者

2389

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

请举例。

4

4 回答 4

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
于 2013-10-08T17:47:21.450 回答
0

正则表达式无法描述您的问题类型。可能有一些具有附加功能的正则表达式工具可以解决您的问题,但是如果您想使用一个只能找到正则表达式描述的字符串的工具,那是不可能的。您的问题需要计算。

于 2013-10-08T17:51:13.720 回答
0

使用 posix 基本正则表达式(即 with grep),使用23894?or 23894\|2389。使用 posix 扩展正则表达式 ( grep -E):23894|2389

Posix 正则表达式(与其他一些变体不同)总是匹配从最早可能的起点开始的可能性集合中最长的匹配。

最早的起点规则意味着,如果您的目标是:

23890000023894

比赛23894?将匹配较早的2389,所以它不是严格意义上的最长匹配。如果您需要字符串中任何位置的最长匹配,那就有点棘手了。

于 2013-10-08T17:57:38.793 回答
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 ]]and echo

我真的觉得应该有一种更有效的方法来做到这一点,但你只是在使用 Bash。

于 2013-10-08T20:07:56.193 回答