正则表达式,不匹配两个下划线

时间:2009-12-09 11:56:14

标签: ruby regex

我不知道这是否真的很容易,我不在乎......

在Ruby的正则表达式中,如何匹配不包含两个连续下划线的字符串,即“__”。

例如:

Matches: "abcd", "ab_cd", "a_b_cd", "%*##_@+"
Does not match: "ab__cd", "a_b__cd"

-Thanks

编辑:我不能使用反向逻辑,即检查“__”字符串并排除它们,因为需要使用Ruby on Rails“validates_format_of()”,它需要一个正则表达式,它将匹配

4 个答案:

答案 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_%*#@+]+