【问题标题】:Regex for alphanumeric string with a maximum number of spaces具有最大空格数的字母数字字符串的正则表达式
【发布时间】:2016-12-01 11:24:44
【问题描述】:

我需要一个 JS 正则表达式来匹配仅基于已知的第一个和最后一个子字符串以及空格数的字符串 - 我不关心第一个和最后一个子字符串之间的长度或性质字符串(除了确切的空格数)。

以下是一个可能的起始字符串(从中我得到第一个和最后一个子字符串以及空格的数量):

cat apple dog mouse

由此,我现在知道该字符串以cat 开头,以mouse 结尾,并且正好包含3 个空格(它们可以在两端之间的任何位置,但它们不会是连续的)。

我需要匹配的字符串可能是:

catfish mouse mouse dormouse mouse mouse

cat mouse mouse mouse mouse mouse

所以,我需要匹配的是,在第一种情况下是catfish mouse mouse dormouse,在第二种情况下是cat mouse mouse mouse - 在这两种情况下,一个字符串都以cat 开头,以mouse 结尾并且正好包含3空格。目前,我的所有尝试都匹配上面的整个示例字符串,而不仅仅是从cat 到第三个mouse。这是我最近的失败:

cat(?:(?![\s]{4,}).*)mouse

我强烈怀疑我想太多了 - 但感谢您的任何建议。

【问题讨论】:

    标签: javascript regex pattern-matching


    【解决方案1】:

    您可以编写一个无需前瞻的正则表达式。

    示例

    \bcat(?:[^\s]*\s){3}[^\s]*mouse\b
    

    Regex Demo


    它有什么作用?
    • \b 匹配单词边界。这确保它不匹配以mousexyz 结尾的字符串
    • cat 匹配字符串开头的 cat
    • (?:[^\s]*\s){3}
      • [^\s]* 匹配除空格以外的任何内容。所以这个匹配一个单词,下面的\s匹配单词后面的空格。
      • {3} 确保 带空格的单个单词 重复 3 次。
    • [^\s]* 匹配 3 个空格后除空格以外的任何字符。
    • mouse 在字符串末尾匹配鼠标

    为什么cat(?:(?![\s]{4,}).*)mouse 不起作用?`

    • (?![\s]{4,}) 这个否定的前瞻,将检查 cat 是否 立即 后跟 4 个空格。这是真的,所以它匹配所有输入字符串。

    【讨论】:

    • 感谢您的快速响应。问题是匹配的第一个和最后一个字符可能是空格。所以,它也需要匹配cat mouse mouse mouse
    • @sideroxylon 为什么不修剪字符串?
    • 因为起始catmouse是匹配的一部分,所以空格不在末尾。
    • 对不起,我错过了理解那部分。将更新答案。您想在匹配中也包含这些空格吗?
    • 是的,来自 cat -> mouse 的整个字符串(有 3 个空格)需要匹配和替换。谢谢!
    【解决方案2】:

    我的正则表达式远不如 nu11p01n73R 好,但我尝试过是为了好玩:

    /cat[^\s]*(\s[^\s]+){2}\s[^\s]*?mouse/
    

    它很丑,但我测试它时它起作用了

    寻找“猫”

    然后遍历任何非空格

    做两次 {

    然后寻找空格

    然后查找至少一个非空白字符

    }

    然后遍历任何非空格

    直到找到鼠标

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多