我需要一些帮助和解释(如果可能的话)一个正则表达式。这里是规格:
- 它由2个字符包围,“::”或“**”(只有两个,并且它们必须在单词的开头和结尾处匹配)
- 它至少有3个字符长(不包括周围的符号)
- 它以大写字母开头
- 仅以小写字母继续
下面是我的正则表达式:
([*|:]{2})(?<emoji>[A-Z]{1}[a-z]{2,})\1
这里是测试输入
Test, test test::Heart:::::: This includes 3 **Snake**, 1 ::Elephant:, 12 **Monk3ys**, a **Gorilla::, 5 ::fox:es: and 21 different types of :Snak::Es::. ::::::::Moon:: **Shy****
害羞
我的正则表达式错误地匹配了Elephant
、Moon
和Shy
,因为这些单词的数量超过了2(:
或*
)。
我尝试了(^
和$
)作为字符串的开始和结束,但没有成功。
1条答案
按热度按时间5ktev3wc1#
除了正则表达式不会阻止匹配分隔符超过两倍的字符串(比如三个
:::
)之外,还有一些其他问题:[*|:]
还匹配管道符号。[*|:]{2}
可以匹配一对两个不同的符号我实际上只捕获分隔符的一次出现,如
([*:])
,然后多次使用\1
来匹配那个 * 相同 * 字符的重复。您可以使用查找Assert来拒绝多于所需的2个定界符号。
如果在分隔符之前/之后不希望有其他符号,则将它们添加到否定查找Assert中。
如果你不想让任何东西包围分隔的单词,那么你应该使用
^
和$
来测试输入是否只有分隔的单词: