我已经找到了很多线程,但不知何故我似乎无法找到一个具体解决这个问题的线程:
我想写一个正则表达式,在段落中捕获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
。
如何修改该正则表达式只执行一次然后停止?
谢谢!
答案 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
这会将每个匹配放在自己的行上,然后打印第一行。
感谢大家的帮助,如果我的措辞令人困惑,我很抱歉。