Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用正则表达式的字符串中相似字符的唯一序列_Javascript_Regex - Fatal编程技术网

Javascript 使用正则表达式的字符串中相似字符的唯一序列

Javascript 使用正则表达式的字符串中相似字符的唯一序列,javascript,regex,Javascript,Regex,我有一些测试字符串: “x” “嗯” “x毫米” “yy x毫米” “xx毫米y毫米” 我想制作一个正则表达式,它应该匹配字符串1,2,3,4,而不是5 所以我的匹配限制是: /(?=^[xym\W]+$)((?=^([^m]*\W)?m+(\W[^m]*)?$)|(?=^([^x]*\W)?x+(\W[^x]*)?$)|(?=^([^y]*\W)?y+(\W[^y]*)?$))/ 字符串中应出现一个字母序列。(例如,“y”是一个y序列,“yy”是两个y的序列,但它们包含相同的字母表,因此它们

我有一些测试字符串:

  • “x”
  • “嗯”
  • “x毫米”
  • “yy x毫米”
  • “xx毫米y毫米”
  • 我想制作一个正则表达式,它应该匹配字符串1,2,3,4,而不是5

    所以我的匹配限制是:

    /(?=^[xym\W]+$)((?=^([^m]*\W)?m+(\W[^m]*)?$)|(?=^([^x]*\W)?x+(\W[^x]*)?$)|(?=^([^y]*\W)?y+(\W[^y]*)?$))/
    
  • 字符串中应出现一个字母序列。(例如,“y”是一个y序列,“yy”是两个y的序列,但它们包含相同的字母表,因此它们相互矛盾,不能同时出现)
  • 字符串中只允许使用特定的字母(对于我的案例“xym”)
  • 任何序列都可以出现在字符串的开头、中间或结尾。但是,如果前面或后面分别有另一个字母序列,则应使用非单词字符作为前缀或后缀
  • 并非所有字母表序列都必须出现在字符串中
  • 注意:-我只需要一个正则表达式来解决这个问题。因为使用单独的正则表达式和迭代,我已经完成了。我正在搜索单行解决方案以验证我的字符串

    我尝试过的解决方案是:

    /(?=^[xym\W]+$)((?=^([^m]*\W)?m+(\W[^m]*)?$)|(?=^([^x]*\W)?x+(\W[^x]*)?$)|(?=^([^y]*\W)?y+(\W[^y]*)?$))/
    
    但它也与第5个案例相匹配。

    您可以使用

    /^(?!.*\b([xym])\1*\b.*\b\1+\b)(?:\s*\b([xym])\2*\b)*\s*$/
    

    详细信息

    • ^
      -字符串的开头
    • (?!.*\b([xym])\1*\b.*\b\1+\b)
      -如果在字符串开始后立即出现错误,则会导致匹配失败的负前瞻
      • *
        -除换行符以外的任何0+字符,尽可能多
      • \b([xym])\1*\b
        -由相同字符组成的一个完整单词,
        x
        y
        m
      • *
        -除换行符以外的任何0+字符,尽可能多
      • \b\1+\b
        -由组1中捕获的字符组成的整个单词
    • (?:\s*\b([xym])\2*\b)*
      -0次或多次重复
      • \s*
        -0个或更多空格字符
      • \b([xym])\2*\b
        -由一个或多个相同字符组成的一个完整单词,
        x
        y
        m
    • \s*
      -0个或更多空格字符
    • $
      -字符串结束

    第五个示例的问题是,
    mm
    出现两次,而不是其中有四个序列?序列可以混合字符吗?
    “xy mx”
    有效吗?@T.J.Crowder yesOkay。请用所有这些更新问题。请注意,“y”不是序列,而是字母(字符)。为了清楚起见,这很重要,因为“y”和“yy”是不同的序列,但它们使用相同的字母。请尝试使用
    /^(?。*\b([xym])\1*\b.*\b\1+\b)\s*[xym\s]+\s*$/
    ,请参见。在这种情况下,“mmm yyy xxyyyx”字符序列必须包含相同的字符。@RK_15
    ^(?。*\b([xym!))\b.*\b([xym m])\b.\1+\b)(?:\s*\b([xym 2*\b)*\s*$
    它失败了,这个案例是“mmmyy yyy xxx”@RK_15有一个用于
    mmmyy yyy xxx
    ,不是预期的吗<代码>yy是重复的,我没有在Regex101网站上尝试过,但在chrome控制台中,此语句返回false->/^(?。*\b([xym])\1*\b.*\b\1+\b)(?:\s*\b([xym])\2*\b)*\s*$/.test(“mmmyy yyy xxx”)