Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.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
Ruby 如何使用正则表达式匹配有例外的数字_Ruby_Regex - Fatal编程技术网

Ruby 如何使用正则表达式匹配有例外的数字

Ruby 如何使用正则表达式匹配有例外的数字,ruby,regex,Ruby,Regex,我需要按5组匹配数字,从1到5,以下例外情况除外: 数字不能包含零 数字不能像11111、22222等等 数字不能像12345或54321 有效数字的一些示例: 14252, 45121, 43412, 51321 ... 到目前为止,我得到了一个表达式来对数字进行分组,并且不允许使用零 /[1-5]{5}/ 但是我在处理第二个和第三个异常时遇到了一些麻烦。如果我有一个重复的数字模式,我尝试使用一个否定的前瞻来禁止匹配,但没有成功 ?!11111|?!22222 我试着用这个表达: (

我需要按5组匹配数字,从1到5,以下例外情况除外:

  • 数字不能包含零
  • 数字不能像11111、22222等等
  • 数字不能像12345或54321
  • 有效数字的一些示例:

    14252, 45121, 43412, 51321 ...
    
    到目前为止,我得到了一个表达式来对数字进行分组,并且不允许使用零

    /[1-5]{5}/ 
    
    但是我在处理第二个和第三个异常时遇到了一些麻烦。如果我有一个重复的数字模式,我尝试使用一个否定的前瞻来禁止匹配,但没有成功

    ?!11111|?!22222 
    
    我试着用这个表达:

    ((?!11111)[1-5]{5}?)
    
    如何编写不匹配特定模式的正则表达式

    我最终会将其更改为不匹配任何其他数字序列。

    这个怎么样

    ^(?!([1-5])\1{4})(?!54321)(?!12345)[1-5]{5}$
    

    你有正确的想法使用否定的lookaheads,只是语法有点不正确。这对我很有用:


    \A(?!11111 | 2222 | 33333 | 44444 | 55555 | 12345 | 54321)[1-5]{5}\z

    首先,您不必将所有内容都塞进一个正则表达式中。正则表达式已经很复杂了,如果可以在多个正则表达式中执行,这通常会使事情变得更简单,并允许编写更灵活的代码。例如,您可以根据失败的条件自定义错误消息。通常,出于性能原因,您只需要将多个正则表达式折叠在一起,并且有一些工具可以自动完成这项工作

    到目前为止,我得到了一个表达式来对数字进行分组,并且不允许使用零

    /[1-5]{5}/ 
    
    /[1-5]{5}/

    小心,您必须在两端确保它将接受任何包含1-5的5次运行的字符串

    /\A[1-5]{5}\z/
    
    数字不能像11111、22222等等

    在正则表达式中使用一个。捕捉第一个数字,然后看看是否还有四个
    ()
    捕获,并
    \1
    引用捕获的内容

    /\A([1-5])\1{4}\z/'
    
    数字不能像12345或54321


    这里有一个不使用正则表达式的解决方案。我理解我们需要确定:a)字符串是否包含五个字符;b) 每个字符等于“1”、“2”、“3”、“4”或“5”;c) 该字符串至少包含两个不同的字符;d)字符串既不是“12345”也不是“54321”。我们可以这样做

    def is_ok?(str)
      str.size == 5                              &&  # five characters
      (str.chars - ['1','2','3','4','5']).empty? &&  # only the digits '1'-'5'
      str.squeeze.size > 1                       &&  # not all the same character
      str != '12345'                             &&  # not an increasing sequence  
      str != '54321'                                 # not a decreasing sequence
    end
    
    is_ok? '12543' #=> true
    is_ok? '12043' #=> false
    is_ok? '12643' #=> false
    is_ok? '22222' #=> false
    is_ok? '12345' #=> false
    is_ok? '54321' #=> false
    

    为什么在后续需求中使用正则表达式
    str[/\A[1-5]{5}\z/]&&str.chars.uniq.count>1&&str.chars.uniqu.count<5
    @meagar也许可以解释一下这个答案?@Schwern否。这就是我添加它作为评论的原因。如果我想写一个答案,我会写一个答案。你的“数字”是一个包含五位数字的字符串吗?你的输入看起来像什么?您是否试图提取字符串中的数字,如
    “数字23451有效”
    ?或者您是否已经提取了候选人编号?从-1切换到+1.:)从中借用
    ([1-5])\1{4}
    ,我们就赢了!