我需要一些帮助和解释(如果可能)与一个正则表达式. 以下是规格说明:

  • 它由两个字符组成,可以是"::",也可以是"**"(只有两个字符,且必须匹配单词的开头和结尾)
  • 长度至少为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****

Shy

我的正则表达式错误地匹配了ElephantMoonShy,因为这些单词多于2(:*).

我试着用(^$)作为字符串的开始和结束,但没有成功.

推荐答案

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

  • [*|:]还与管道符号匹配.
  • [*|:]{2}可以匹配一对两个different符号

我实际上只捕获分隔符的一次出现,比如([*:]),然后多次使用\1来匹配这same个字符的重复.

当分隔符号多于所需的2个时,可以使用环视断言来拒绝.

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

如果在分隔符之前/之后还有其他您不想要的符号,则将它们添加到否定环视断言中.

如果您不想让anything包含分隔的单词,那么您应该使用^$测试输入是否仅限于此:

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

Javascript相关问答推荐

React Hooks中useState的同步问题

JS、C++和C#给出不同的Base 64 Guid编码结果

如何使用JavaScript用等效的功能性HTML替换标记URL格式?

如何使用Echart 5.5.0创建箱形图

仅圆角的甜甜圈图表

在React中获取数据后,如何避免不必要的组件闪现1秒?

if/else JavaScript中的条件行为

node TS:JWT令牌签名以验证客户端和后台问题之间的身份验证

使用续集和下拉栏显示模型属性

更改JSON中使用AJAX返回的图像的路径

用于编辑CSS样式的Java脚本

传递方法VS泛型对象VS事件特定对象

在验证和提交表单后使用useNavigate()进行react 重定向,使用带有加载器和操作的路由

如何更改Html元素S的 colored颜色 ,然后将其褪色为原始 colored颜色

表单数据中未定义的数组键

如何在Firebase中读取对象的特定字段?

如何在加载页面时使锚定标记成为焦点

当S点击按钮时,我如何才能改变它的样式?

Reaction-在同一页内滚动导航(下拉菜单)

MAT-TREE更多文本边框对齐问题