正则表达匹配字符串具有确切的字符数

时间:2018-03-14 12:29:38

标签: regex

我有一些字符串:

1:2:3:4:5  
2:3:4:5  
5:3:2  
6:7:8:9:0  

如何查找具有确切冒号数的字符串?

示例我需要找到4个冒号的字符串。

结果:

1:2:3:4:56:7:8:9:0

Edit:

无论冒号之间有什么文字,都可以这样:

qwe:::qwe:
:998:qwe:3ee3:00

我必须指定number冒号,但使用regexp_matches。 它类似于过滤器来搜索破碎的字符串。

感谢。

3 个答案:

答案 0 :(得分:0)

您想要使用量词语法{4}。量词用于指示前一个捕获组需要发生n次才能满足匹配条件。找到由分号分隔的五位数的模式。像下面这样的东西会起作用。

((\d\:){4}\d)

我假设您可能需要任何数字或单词字符,但不能使用空格或标点符号。在这种情况下,请使用单词character(\w)。

((\w)[\:]){4}(\w))

但根据您对该模式的处理方式,您可能需要使用不同的正则表达式。如果您希望捕获并替换所有冒号,同时保持数字完整,则您的模式需要使用字符串替换或更高级的分组。

答案 1 :(得分:0)

任意数量的任何字符,包括4:

((.*:){4}.*)

答案 2 :(得分:0)

N是您搜索的数字:

"^([^:]*:){N}[^:]*$"

这是一个测试:

for s in ":::foo:bar" "foo:bar:::" "fo:o:ba::r" ; do echo "$s" | egrep "^([^:]*:){4}[^:]*$" ; done

更改4到3和5,看它不匹配。

也许postgresql需要特定的标志或屏蔽某些元素。

"^([^:]*:){N}[^:]*$"
"^                $"
# matching the whole String/Line, not just a part
 "([^:]*:){N}[^:]*"
 "(      ){N}[^:]*"
# N repetitions of something, followed by an arbitrary number of non-colons (maybe zero)
 "([^:]*:)"
# non-colons in arbitrary number (including zero), followed by a colon