我不知道这是否真的很容易,我不在乎......
在Ruby的正则表达式中,如何匹配不包含两个连续下划线的字符串,即“__”。
例如:
Matches: "abcd", "ab_cd", "a_b_cd", "%*##_@+"
Does not match: "ab__cd", "a_b__cd"
-Thanks
编辑:我不能使用反向逻辑,即检查“__”字符串并排除它们,因为需要使用Ruby on Rails“validates_format_of()”,它需要一个正则表达式,它将匹配答案 0 :(得分:10)
您可以使用否定前瞻:
^((?!__).)*$
字符串的开头^
和字符串$
的结尾很重要,它们会强制检查每个位置上的“没有双重下划线”。
答案 1 :(得分:4)
/^([^_]*(_[^_])?)*_?$/
试验:
regex=/^([^_]*(_[^_])?)*_?$/
# Matches
puts "abcd" =~ regex
puts "ab_cd" =~ regex
puts "a_b_cd" =~ regex
puts "%*##_@+" =~ regex
puts "_" =~ regex
puts "_a_" =~ regex
# Non-matches
puts "__" =~ regex
puts "ab__cd" =~ regex
puts "a_b__cd" =~ regex
但正则表达式对此任务来说太过分了。简单的字符串测试更容易:
puts ('a_b'['__'])
答案 2 :(得分:2)
改变你的逻辑是否仍然有效?
您可以检查字符串是否包含带有正则表达式[_] {2}的两个下划线,然后忽略它?
答案 3 :(得分:0)
否定前瞻
\b(?!\w*__\w*)\w+\b
在单词的开头搜索下一个单词中的两个连续下划线,如果找不到,则匹配该单词。
编辑:在比赛中容纳除空格以外的任何内容:
(?!\S*__\S*)\S+
如果您希望容纳符号的子集,您可以编写如下内容,但它会与_cd
中的a_b__cd
匹配。
(?![a-zA-Z0-9_%*#@+]*__[a-zA-Z0-9_%*#@+]*)[a-zA-Z0-9_%*#@+]+