regex 简单的正则表达式问题

w8f9ii69  于 2023-04-22  发布在  其他
关注(0)|答案(1)|浏览(194)

我需要一些帮助和解释(如果可能的话)一个正则表达式。这里是规格:

  • 它由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****

害羞

我的正则表达式错误地匹配了ElephantMoonShy,因为这些单词的数量超过了2(:*)。
我尝试了(^$)作为字符串的开始和结束,但没有成功。

5ktev3wc

5ktev3wc1#

除了正则表达式不会阻止匹配分隔符超过两倍的字符串(比如三个:::)之外,还有一些其他问题:

  • [*|:]还匹配管道符号。
  • [*|:]{2}可以匹配一对两个不同的符号

我实际上只捕获分隔符的一次出现,如([*:]),然后多次使用\1来匹配那个 * 相同 * 字符的重复。
您可以使用查找Assert来拒绝多于所需的2个定界符号。

(?<![*:])([*:])\1(?<emoji>[A-Z]{1}[a-z]{2,})\1\1(?![*:])

如果在分隔符之前/之后不希望有其他符号,则将它们添加到否定查找Assert中。
如果你不想让任何东西包围分隔的单词,那么你应该使用^$来测试输入是否只有分隔的单词:

^([*:])\1(?<emoji>[A-Z]{1}[a-z]{2,})\1\1$

相关问题