Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 如何使用正则表达式匹配可能最长的字符串_Regex_Linux_Bash - Fatal编程技术网

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

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

我需要将数字串与尽可能长的匹配项进行匹配

例如:

全数: 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
#所有可能的部分匹配/非匹配字符串
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”,对吗?