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