Ruby 不匹配两个下划线的正则表达式
我不知道这是否真的很容易,我已经疯了 在Ruby的正则表达式中,如何匹配不包含两个连续下划线的字符串,即“\uuuu” 例: -谢谢 编辑:我不能使用反向逻辑,即检查“uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuRuby 不匹配两个下划线的正则表达式,ruby,regex,Ruby,Regex,我不知道这是否真的很容易,我已经疯了 在Ruby的正则表达式中,如何匹配不包含两个连续下划线的字符串,即“\uuuu” 例: -谢谢 编辑:我不能使用反向逻辑,即检查“uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu \b(?!\w*__\w*)\w+\b 从单词开头开始搜索下一个单词中的两个连续下划线,如果找不到,则匹配该单词 编
\b(?!\w*__\w*)\w+\b
从单词开头开始搜索下一个单词中的两个连续下划线,如果找不到,则匹配该单词
编辑:要在匹配中容纳除空白以外的任何内容:
(?!\S*__\S*)\S+
如果您希望容纳符号的子集,可以编写如下内容,但它将与a\u b\u cd
中的\u cd
以及其他内容相匹配
(?![a-zA-Z0-9_%*#@+]*__[a-zA-Z0-9_%*#@+]*)[a-zA-Z0-9_%*#@+]+
您可以使用负前瞻:
^((?!__).)*$
字符串
^
的开头和字符串$
的结尾很重要,它们在每个位置强制检查“后面不带双下划线”。更改逻辑是否仍然有效
您可以使用正则表达式[]{2}检查字符串是否包含两个下划线,然后忽略它
/^([^_]*(_[^_])?)*_?$/
测试:
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'['__'])
@秋葵汤:\w代表“单词字符”,通常为[A-Za-z0-9]。请注意,在下一个单词中的任何位置都包含了下划线和数字,用于搜索
\uuu
。啊,对不起。与-
混淆。可能的字符是什么?将\w
替换为类似[a-zA-Z0-9%*.#u@+]
的内容,以匹配所需的字符。了解概念。但是,@Andomar有一个更好的消极前瞻模式(按长度说话)。尽管如此,仍将给出+1。非常感谢您在Ruby中停留和回答^
和$
分别是行首和行尾(对于包含多行的字符串)。严格地说,使用\A
和\Z
作为字符串的开头和结尾谢谢,效果很好。但是,不幸的是,我只能选择一个答案,所以选择了“MarkByers”,因为他的解决方案很简单。尽管如此,+1是肯定的。昨天,我没有选择你的答案作为接受答案,因为那时我不知道“消极展望”的事情,但现在我知道了。所以,现在我发现你的答案是“哇”。我试图修改它,但没有更好的了。谢谢你的回答。效果很好,看起来很“不复杂”(相对而言)。另外,感谢您花时间编写这些示例。我只需要对我的irb
会话进行“复制粘贴”以进行验证。另外,另一个正确答案-我认为这是验证的格式中的一个设计错误。它应该采用一般谓词。正则表达式是一个实现细节。
puts ('a_b'['__'])