首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >验证字符串#,后面跟着数字,但每次发生后#都会增加

验证字符串#,后面跟着数字,但每次发生后#都会增加
EN

Stack Overflow用户
提问于 2021-03-12 08:31:58
回答 4查看 125关注 0票数 6

我有一根看起来像这样的绳子

代码语言:javascript
运行
复制
#123##1234###2356####69

它以#开头,后面跟着任何数字,每次#出现时,#的数量都会增加,第一次1次,第二次2次,等等。

它类似于这个正则表达式,但是由于我不知道这个模式会持续多久,所以它不是很有用。

代码语言:javascript
运行
复制
^#\d+##\d+###\d+$

我使用PCRE引擎,它允许递归(?R)和条件(?(1)...)等。

是否存在验证此模式的正则表达式?

有效

  • #123
  • #12##235
  • #1234##12###368
  • #1234##12###368####22235#####723356

无效

  • ##123
  • #123###456
  • #123##456##789

我试过^(?(1)(?|(#\1)|(#))\d+)+$,但它似乎根本不起作用

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2021-03-12 11:20:27

您可以使用条件子模式匹配来完成这个任务。

代码语言:javascript
运行
复制
^(?:((?(1)\1)#)\d+)++$

RegEx演示

RegEx详细信息:

  • ^:开始
  • (?::启动非捕获组
    • (:启动捕获组#1
      • (?(1)\1)if/then/else指令,意思是只有当第一个捕获组可用时,才能匹配回引用\1,否则匹配为null。
      • #:匹配一个附加的#

代码语言:javascript
运行
复制
- `)`: End capture group #1
- `\d+`: Match 1+ digits
  • )++:结束非捕获组。匹配这个非捕获组的1+。
  • $:结束
票数 9
EN

Stack Overflow用户

发布于 2021-03-12 11:20:35

一个选项可以是使用所有量量词 \1?+#在每次迭代中添加#,将反向引用匹配到组1中的组1。

代码语言:javascript
运行
复制
^(?:(\1?+#)\d+)++$
  • 字符串的^开始
  • (?:非捕获群
    • (\1?+#)\d+捕获组1,将一个可选的拥有式反向引用匹配到第1组中已经捕获的内容,并添加匹配的#和1+数字。

  • )++关闭非捕获组并拥有地重复1+时间
  • 字符串的$末端

Regex演示

票数 5
EN

Stack Overflow用户

发布于 2021-03-12 11:40:47

我想你可以在这里使用前向引用:

代码语言:javascript
运行
复制
^(?:((?:\1(?!^)|^)#)\d+)+$

regex演示

详细信息

  • ^ -字符串的开始
  • (?:((?:\1(?!^)|^)#)\d+)+ -发生一个或多个事件
    • ((?:\1(?!^)|^)#) -组1( \1值):字符串的开始或组1值的出现(如果它不在字符串起始位置)
    • \d+ -一个或多个数字

  • $ -字符串的末端。

注意事项:这种技术不适用于不支持前向引用的regex口味,比如基于ECMAScript的口味(例如JavaScript、VBA、C++ std::regex)。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66596578

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档