如何通过正则表达式匹配以某个字符串开头的字符串

5
在bash脚本中,我必须匹配以字符串lo开头的恰好3次的字符串; 因此lololoba是好的,loloba是坏的,lololololoba是好的,balololo是坏的。
我尝试了这个模式:"^$str1/{$n,}",但它不起作用,我该怎么做?
编辑:
根据OP的评论,lololololoba现在是坏的。

1
(lo){3} 是什么意思? - NightShadeQueen
3
那么超过3次出现“lo”也可以吗? - anubhava
3
@anubhava,我认为它是对的,但是“exactly”的表述有点令人困惑。 - 123
抱歉,那时我处于愤怒模式,写错了一些东西,超过3是不好的,所以“lolololoba”不好! - Jaeger
好的,我提供了一个答案,只匹配以恰好3个“lo”开头的行。 - anubhava
我看到了你的评论,已经添加了一个匹配正好3次(不超过)的模式。 - Jahid
4个回答

6
这应该可以工作:
pat="^(lo){3}"
s="lolololoba"
[[ $s =~ $pat ]] && echo good || echo bad

根据OP的评论进行编辑:

如果您想恰好匹配3次(例如lolololoba等应不匹配):

pat="^(lo){3}"更改为:

pat="^(lo){3}(l[^o]|[^l].)"

3

3
不需要 .*$ - 它没有任何有用的作用。虽然这是一个有效的正则表达式,但如果不展示如何使用它(例如使用 grep -E),它并不完整。 - Tom Fenech
1
\1 的意义是什么?为什么不直接匹配字符串三次? - 123
@TomFenech 是的,你说得对,但我想给一个提示而不是完整的答案! - Mazdak
2
嗯,为什么不让你的回答更有用一些呢? - Tom Fenech
还要注意的是,这将匹配太多内容,例如它将匹配OP认为不好的“lolololoba”。 - Mitch

0

您可以使用 awk 来精确匹配开头的 3lo

# input file
cat file
lololoba
balololo
loloba
lololololoba
lololo

# awk command to print only valid lines
awk -F '^(lo){3}' 'NF == 2 && !($2 ~ /^lo/)' file
lololoba
lololo

0
根据您的评论:
... more than 3 is bad so "lolololoba" is not good! 

你会发现@Jahid的答案不适用(因为他的答案对于那个测试字符串给出了“好”)。

要使用正确的正则表达式来使用他的答案:

pat="^(lo){3}(?\!lo)"
s="lolololoba"
[[ $s =~ $pat ]] && echo good || echo bad

这将验证开头有三个 "lo",而不是紧接着这三个之后还有另一个。

请注意,如果您使用的是 bash,则必须转义第一行中的 !(这就是我上面的正则表达式所做的)


如果您感兴趣,我已经添加了另一种模式。 - Jahid

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接