正则表达式随机位置的确切字符的确切数量

时间:2018-02-23 19:54:53

标签: regex

例如,我有一个字符串:

R-G-B-G

我想知道这个字符串是否包含至少2个'G',1个'R'和1个“B”。 字符串可以将其大小从1更改为11个符号,字母可以出现在由“ - ”分隔的随机位置。

3 'R' -> R-R-G-R-R-B -> match
2 'B' -> ... -> not match
1 'R' 1 'G' 1 'B' -> ... -> match

修改

继续前进我需要检查更多案例。
我的字符串由套接字,链接和颜色组成,例如:

R R-R B-R-R has 6 Sockets, one 2-link, one 3-link, 5R, 1B and 0G colors.

用户向我发送了许多套接字,链接长度以及该链接中所需的颜色,我必须告诉它是否具有所有这些。我已经构建了表达式以匹配每个案例,但我无法弄清楚如何将它们组合在一起。

6 socketsLink with size 22 R colors

所有组合必须返回true,因为R RR BRR,另一方面,字符串: RRR BRR 必须为false,因为2 R link是3的一部分链接BRR。

或者我应该运行3个单独的表达式,其中先前的输出作为输入发送到下一个。

1 个答案:

答案 0 :(得分:1)

您可以在开始 select @data, @data.STAsText() --Convert to polygon it DECLARE @Polygon geography SET @Polygon = geography::STGeomFromWKB( 0x01 + 0x03000000 + 0x01000000 + SUBSTRING(@data.STAsBinary(),6,datalength(@data.STAsBinary())),@data.STSrid) select @Polygon 后为每个必需的字母链接前瞻(?=...)

F.e。对于至少两个' R'和两个G'和一个' 并且对于1到11长的字符串。

^

测试here on regex101

请注意,这些预测中使用的延迟搜索^(?=(?:.*?R){2})(?=(?:.*?G){2})(?=(?:.*?B){1}).{1,11}$ 只是速度优化 在这种情况下它会变得非常重要,因为它是如此短的字符串。