Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 不匹配两个下划线的正则表达式_Ruby_Regex - Fatal编程技术网

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

Ruby 不匹配两个下划线的正则表达式,ruby,regex,Ruby,Regex,我不知道这是否真的很容易,我已经疯了 在Ruby的正则表达式中,如何匹配不包含两个连续下划线的字符串,即“\uuuu” 例: -谢谢 编辑:我不能使用反向逻辑,即检查“uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu \b(?!\w*__\w*)\w+\b 从单词开头开始搜索下一个单词中的两个连续下划线,如果找不到,则匹配该单词 编

我不知道这是否真的很容易,我已经疯了

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

例:

-谢谢

编辑:我不能使用反向逻辑,即检查“uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu

\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'['__'])