我需要匹配5个组中的数字,从1到5,但以下情况除外:
有效数字的一些例子:
14252, 45121, 43412, 51321 ...
到目前为止,我得到了一个表达式来对数字进行分组,并且不允许使用零。
/[1-5]{5}/
但是我在处理第二个和第三个例外方面遇到了一些麻烦。如果我有一个重复数字的模式,我尝试使用否定先行来禁止匹配。
?!11111|?!22222
我正在尝试使用这个表达式:
((?!11111)[1-5]{5}?)
如何编写正则表达式以匹配某些模式?
我最终会将其更改为与任何其他数字序列不匹配。
答案 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