如何使用正则表达式匹配数字与一些例外

时间:2017-09-11 18:27:51

标签: ruby regex

我需要匹配5个组中的数字,从1到5,但以下情况除外:

  1. 数字不能包含零
  2. 数字不能像11111,22222等。
  3. 数字不能像12345或54321
  4. 有效数字的一些例子:

    14252, 45121, 43412, 51321 ...
    

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

    /[1-5]{5}/ 
    

    但是我在处理第二个和第三个例外方面遇到了一些麻烦。如果我有一个重复数字的模式,我尝试使用否定先行来禁止匹配。

    ?!11111|?!22222 
    

    我正在尝试使用这个表达式:

    ((?!11111)[1-5]{5}?)
    

    如何编写正则表达式以匹配某些模式?

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

4 个答案:

答案 0 :(得分:1)

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

  

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

     

/[1-5]{5}/

小心,你必须在两端anchor,否则它将接受任何包含5的1-5的字符串。

/\A[1-5]{5}\z/
  

数字不能像11111,22222等。

在正则表达式中使用capture来完成此操作。捕获第一个数字,然后查看是否还有四个。 ()捕获并\1引用捕获的内容。

/\A([1-5])\1{4}\z/'
  

数字不能像12345或54321

/\A(?:12345|54321)\z/

答案 1 :(得分:1)

这是一个不使用正则表达式的解决方案。我知道我们要确定:a)字符串是否包含五个字符; b)每个字符等于' 1',' 2',' 3',' 4'或者' 5&#39 ;; 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

答案 2 :(得分:0)

这个怎么样?

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

答案 3 :(得分:0)

你有正确的想法使用否定前瞻,只是语法有点偏。这对我有用:

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