正则表达式只匹配第一个实例

时间:2017-03-13 21:42:40

标签: regex bash

我已经找到了很多线程,但不知何故我似乎无法找到一个具体解决这个问题的线程:

我想写一个正则表达式,在段落中捕获3个连续的整个单词,然后停止。例如:

select
    limite 
from
    Limite limite 
join
    fetch limite.limiteEnqs enq 
join
    fetch enq.limiteValors valor 
where
    limite.id      = :limiteId 
    and   :dataReferencia between valor.dtIniVig and valor.dtFimVig 
    and enq.vrAtributo1 = case limite.atributoId1 
        when 8 then :produtoId 
        else enq.vrAtributo1 
    end 

我只想捕捉 while(Index != N){ repeatedString[Index] = oldString[Index%strlen(oldString)]; Index++; } 而已。我非常接近使用I am dog 234 I am cat (@#$#@$#@) I am bear #$F#$F I am frog 执行此操作,但这将返回I am dog

如何修改该正则表达式只执行一次然后停止?

谢谢!

3 个答案:

答案 0 :(得分:0)

我会同意Wictor在这个正则表达式问题中...如果你需要从现实世界中的这个长字符串中捕获“我是一只狗”这个词,而不是在正则表达式在线测试程序中,你可以尝试其中一个bash:

$ echo "i am a dog ...." |grep -Po '^([A-Za-z]+\s){3}'

$ echo "i am a dog ...." |perl -pe 's/([A-Za-z].*?)([0-9]).*/\1/'

两者都将返回I am dog(使用bash 4.4在Debian 9上测试)

同时检查一下:

$ echo "345 I am dog 234 I am cat (@#$#@$#@) I am bear #$F#$F I am frog" |grep -Po '^.*? \K([A-Za-z]+\s){3}'
I am dog 

答案 1 :(得分:0)

如果你可以自由使用perl我会推荐这样的东西:

perl -pe 's/.*?([a-zA-Z]+)\s([a-zA-Z]+)\s([a-zA-Z]+).*/$1 $2 $3/'

开头的.*?是一个非贪婪的匹配,所以如果你的字符串以3个单词开头,它将匹配任何内容,但如果没有,它将匹配所有内容,直到三个单词的开头。

答案 2 :(得分:-1)

我无法通过正则表达式解决这个问题,但是能够在Bash中找到解决方案

grep -Po'((?:[A-Za-z] + \ s){3})' |头-n 1

这会将每个匹配放在自己的行上,然后打印第一行。

感谢大家的帮助,如果我的措辞令人困惑,我很抱歉。