仅适用于数字和连字符的正则表达式

2024-04-26

我试图理解正则表达式,对于长度为 10 的数字我可以简单地做

/^[0-9]{10}$/

对于连字符只有我能做

/^[-]$/

使用组表达式将两者结合起来将导致

/^([0-9]{10})|([-])$/

该表达式无法按预期工作,如果字符串无效,它会以某种方式匹配字符串的一部分,而不是根本不匹配。

如何制作只接受“-”或 10 位数字的正则表达式?


将两个正则表达式完全按照您的方式组合起来会很好。换句话说,只需使用交替/管道运算符来组合

/^[0-9]{10}$/

and

/^[-]$/

照原样,直接进入

/^[0-9]{10}$|^[-]$/
 ↑↑↑↑↑↑↑↑↑↑↑ ↑↑↑↑↑     YOUR ORIGINAL REGEXPS, COMBINED AS IS WITH |

这可以表示为

那效果会很好。正如其他人指出的那样,您不需要在字符类中指定连字符,因此

/^[0-9]{10}$|^-$/
              ↑        SIMPLIFY [-] TO JUST -

现在,我们注意到这两种选择都有一个^在开始时和$在最后。这有点重复,而且也使得立即看出正则表达式始终从头到尾匹配事物变得更加困难。因此,我们可以重写它,正如其他答案中所解释的那样,通过采用^ and $出两个子正则表达式,并使用分组运算符组合它们的内容():

/^([0-9]{10}|-)$/
  ↑↑↑↑↑↑↑↑↑↑↑↑↑        GROUP REGEXP CONTENTS WITH PARENS, WITH ANCHORS OUTSIDE

对应的可视化是

这也可以正常工作,但你可以使用\d代替[0-9], 所以最终的、最简单的版本 is:

/^(\d{10}|-)$/
   ↑↑                  USE \d FOR DIGITS

这可视化为

如果由于某种原因您不想“捕获”该组,请使用(?:, as in

/^(?:\d{10}|-)$/
   ↑↑                  DON'T CAPTURE THE GROUP

现在,可视化显示该组未被捕获:

顺便说一句,在您最初尝试组合两个正则表达式时,我注意到您将它们括起来,如下所示

/^([0-9]{10})|([-])$/
  ↑↑↑↑↑↑↑↑↑↑↑ ↑↑↑↑↑    YOU PARENTHESIZED THE SUB-REGEXPS

但实际上这是不必要的,因为管道(“或”的替代)运算符已经具有较低的优先级(实际上它具有所有正则表达式运算符的最低优先级); “低优先级”意味着它仅适用after两边的东西都已经处理过了,所以你在这里写的和

/^[0-9]{10}|[-]$/

然而,由于其他答案中提到的原因,它仍然不起作用,从其可视化中可以清楚地看出:

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

仅适用于数字和连字符的正则表达式 的相关文章

随机推荐

  • std::tr1::shared_ptr 是如何实现的?

    我一直在考虑使用共享指针 并且我知道如何自己实现一个 不想这样做 所以我正在尝试std tr1 shared ptr 我有几个问题 引用计数是如何实现的 它使用双向链表吗 顺便说一句 我已经用谷歌搜索过 但找不到任何可靠的东西 使用过程中有
  • 将命令行参数传递给已运行的应用程序实例

    我想将应用程序新实例的命令行参数传递给已经运行的应用程序 如果存在 到目前为止 我已经尝试了以下方法 程序 cs string Arguments Environment GetCommandLineArgs int iCurrentPro
  • 以编程方式将音乐文件访问到我的应用程序中

    如何以编程方式将设备中的音乐文件访问到我的应用程序中 另一种方法可能是使用 MediaStore 内容提供程序来查找您的音乐 http developer android com reference android provider Med
  • 如何查看大 JSON 对象是否包含值?

    我正在使用 PHP 对大量多维事件数组进行 json 编码 所以我得到如下内容 var ents 7 event id 7 nn The Whisky Drifters nn url the whisky drifters venue Th
  • 如何在 flutter 中重用有状态的 widget

    我有一个以下状态完整小部件 我需要通过更改两个变量来重用它id and collectionName 一般来说 我会提取一个小部件 但在这种情况下 我正在修改变量firstName 这不会让我提取小部件 class IndividualSi
  • 向量的循环移位(相当于numpy.roll)

    我有一个向量 a lt c 1 2 3 4 5 我想做一些类似的事情 b lt roll a 2 4 5 1 2 3 R中有类似的函数吗 我一直在谷歌上搜索 但 R Roll 主要给我提供有关西班牙语发音的页面 怎么样使用head and
  • WebStorm 没有本地存储的库

    我一直在开发一个完全可以在 jsfiddle net 上运行的项目 然而 当我尝试在 webStorm 中运行这个项目时 我收到两个错误 first second 之前 我在这里发布我的问题 我在 stackoverflow 上搜索但找不到
  • C++ 模板特化/重载

    首先 我对这个问题的模糊标题感到抱歉 我不知道如何总结它 我想要实现的目标如下 我希望能够将不同类型的模板非类型参数传递给同一个类模板 从而产生不同的实例化 像这样的事情 Foo lt 1 gt Foo lt 1 gt different
  • 是否可以在不使用清单的情况下设置 Powershell 模块名称/版本?

    我可以看到 如果没有清单 默认模块名称将设置为 psm1 文件名 但是有没有办法在模块代码中设置它 我也想在代码中设置版本 如果您要导入二进制模块 则将从程序集元数据中提取模块版本 然而 该名称只是 DLL 的文件名 对于脚本模块 psm1
  • 尝试在整数后添加字符然后打印结果时出现奇怪的结果

    我正在尝试创建一个简单的欧姆定律计算器 所以我们的想法是你可以填写两个变量 然后它会计算第三个变量 当我创建这个程序时 我发现了一个小问题 我不明白它是如何发生的 不幸的是我无法找到答案 我尝试打印一个显示完整计算的字符串 用户填写的两个变
  • Blenderbot 微调

    我一直在尝试微调 HuggingFace 的对话模型 Blendebot 我已经尝试过官方拥抱脸网站上给出的传统方法 该方法要求我们使用 trainer train 方法来完成此操作 我使用 compile 方法尝试了它 我尝试过使用 Py
  • WCF OperationContract 方法的 WebGet 属性可以有多个 ResponseFormat 类型吗?

    我有一个 ServiceContract 描述 WCF 服务中使用的方法 该方法具有定义 UriTemplate 和 ResponseFormat 的 WebGet 属性 我想重用单个方法并拥有多个具有不同 UriTemplate 和不同
  • 将正则表达式拆分为 2 个捕获组

    好吧 我之前的问题都得到解答了 我还有一个 这个对我来说比较难 A Za z A Za z0 9 domain com 现在这个表达式只产生 1 个捕获组 如 所示 我该如何为此 URL 执行 2 个捕获组 用于IIS正则表达式重写 您可以
  • 通过wget命令爬取sitemap.xml的链接

    我尝试抓取 sitemap xml 的所有链接以重新缓存网站 但是 wget 的递归选项不起作用 我只得到响应 远程文件存在 但不包含任何链接 无法检索 但可以肯定的是 sitemap xml 充满了 http 链接 我尝试了 wget 的
  • MySQL 一对多转 JSON 格式

    我有两个 MySQL 表 User id name Sale id user item Where Sale user 是一个外键User id 所以这是一种一对多的关系 一个用户可以进行多次销售 我试图从数据库中获取它并以 JSON 格式
  • jquery .ajax() 问题

    我正在使用 Jquery 1 7 1 但遇到了问题 我正在脚本中使用 CRM 并正在努力完成页面 但我遇到了这个问题 my html
  • 在 iOS 中禁用文本选择标注

    我知道当用户长按某个按钮时您可以禁用标注link使用这个 body webkit touch callout none important a webkit user select none important 但是文本选择菜单呢 我的用例
  • 重写具有不同返回类型的成员函数

    考虑下面的例子 include
  • 在 Julia 中提取参数类型

    假设我在 Julia 中编写了一个函数 它接受Dict K V 作为参数 然后创建类型的数组Array K 1 and Array V 1 我怎样才能提取类型K and V来自 Dict 对象 以便我可以使用它们来创建数组 斯文和约翰的答案
  • 仅适用于数字和连字符的正则表达式

    我试图理解正则表达式 对于长度为 10 的数字我可以简单地做 0 9 10 对于连字符只有我能做 使用组表达式将两者结合起来将导致 0 9 10 该表达式无法按预期工作 如果字符串无效 它会以某种方式匹配字符串的一部分 而不是根本不匹配 如