【问题标题】:Javascript matches less than n occurances even thought it's explicitly set tomatch nJavascript 匹配少于 n 次,即使它被明确设置为匹配 n
【发布时间】:2021-09-16 10:00:51
【问题描述】:

好的,我有这个模式

^(([0-9*\/]+)\s??){7}$

默认情况下,它应该匹配可以具有以下示例形式之一的 7 个片段:

[0/2, *, 2, /]

问题是,这匹配:

  • * * 0/2 * * - 不正确
  • * * * * * * * - 正确
  • * 0/2 * * * 2 * - 正确
  • * 0/2 0/2 - 不正确

在 C# 中,我只会在第一个捕获组上使用 ++,它会起作用,但 Javascript 有一个过时的正则表达式,缺少关键功能。

这里是重现的游乐场:https://regex101.com/r/Pk23dV/1

【问题讨论】:

  • 您没有告诉正则表达式引擎匹配 7 次出现的空格分隔实体。您只告诉它匹配 7 个出现的一个或多个数字、星号或斜杠,空格是可选的(请参阅?? 量词)。此外,您不能在 C# 中使用 ++,它的正则表达式引擎不支持所有格量​​词(仍然停留在 regex101 测试中?regex101 不支持 .NET 正则表达式风格)。使用^[0-9*\/]+(?:\s[0-9*\/]+){6}$
  • @WiktorStribiżew 我没有被 regex101 困住,我让它在 C# 中工作,这次我在使用 Javascript 时遇到了困难
  • 但是你不能在 C# 中使用++。请在评论中分享那部分 C# 代码,我很乐意看到。 ^[0-9*\/]+(?:\s[0-9*\/]+){6}$ 是否以您想要的方式解决当前问题?如果要允许尾随空格,请在 $ 之前添加 \s?
  • @WiktorStribiżew 我还没有在后端测试它,我还没有让前端部分运行(javascript)
  • 好的,只是想防止再次重复

标签: javascript regex


【解决方案1】:

(([0-9*\/]+)\s??){7}$ 模式属于^((a)b?){x}$ 类型,其中a 部分是必需的,b 部分是可选的。也就是说,正则表达式中的{7} 量词意味着必须至少出现七次与[0-9*\/] 模式匹配的字符,无论是连续的还是用空格分隔的。

如果您想编写一个表达式,其中 \s[0-9*\/]+ 部分之间是强制性的,您可以使用任一

^[0-9*\/]+(?:\s[0-9*\/]+){6}$
^(?:([0-9*\/]+)(?:\s(?!$)|$)){7}$

请参阅regex demo 1regex demo 2

正则表达式详细信息

  • ^ - 字符串开头
  • [0-9*\/]+(?:\s[0-9*\/]+){6} - 一位或多位数字,/*,然后出现六次空格,然后是一位或多位数字,/*
  • (?:([0-9*\/]+)(?:\s(?!$)|$)){7} - 七次出现一个或多个数字,/* 如果不在字符串末尾或字符串末尾,则后跟一个空格
  • $ - 字符串结束。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-04
    • 2013-12-02
    • 1970-01-01
    • 2010-10-15
    相关资源
    最近更新 更多