Ruby正则表达式`/^/`

Ruby正则表达式`/^/`,ruby,regex,Ruby,Regex,这是我的代码: ['banana', 'anana', 'naan'].map do |food| food.reverse end.select { |f| f.match /^a/ } # => ["ananab", "anana"] 我想知道这个正则表达式是否用于查找包含不同于“a”(否定)字符的单词,或者正则表达式是否匹配以“a”开头的单词(ananab和anana) 谁能再帮我一点忙吗 正则表达式/^a/的意思是:“匹配第一个字符为a的任何字符串”。此处的^字符表示字符串

这是我的代码:

['banana', 'anana', 'naan'].map do |food|
   food.reverse
end.select { |f| f.match /^a/ }
# => ["ananab", "anana"]
我想知道这个正则表达式是否用于查找包含不同于
“a”
(否定)字符的单词,或者正则表达式是否匹配以
“a”
开头的单词(
ananab
anana


谁能再帮我一点忙吗

正则表达式
/^a/
的意思是:“匹配第一个字符为
a
的任何字符串”。此处的
^
字符表示字符串的开头

我相信您要查找的是
/[^a]/
,这意味着:“匹配任何包含非
a
字符的字符串”。
[^…]
语法将匹配大括号内的字符以外的任何字符

要真正得到您想要的内容,请在末尾抛出一个
*
/^[^a]*$/
,意思是:“匹配从开始(
^
)到结束(
$
)的所有字符都不是
a
)的任何字符串



附录:根据评论,我写“字符串”的地方实际上是指“字符串或行”“。
^
$
字符是锚定符,将正则表达式固定到行的开头或结尾。或者,对于没有任何换行符的字符串,它将锚定到字符串的开头或结尾。

如果您认为
^
表示否定,则只有当它是表示字符组的
[]
中的第一个字符时,才是否定。即使您有一个否定
[^a]
,也不意味着字符串没有字符
a
。它表示具有除
a
以外的字符的字符串

正则表达式是一种尝试匹配某些内容的工具。在它的实现中,它将通过更改匹配位置、回溯等方式尝试以任何可能的方式匹配模式。如果要查看字符串是否与模式不匹配,最直接的方法是对谓词使用否定,而不是对正则表达式使用否定。当字符串
s
不包含
a
时,以下将返回true:

s !~ /a/
但在这种简单的情况下,您可以:

!s.include?("a")
或者,您可以使用
拒绝
,而不是
选择

reject{|s| s.include?("a")}

请尝试以下方法:

['banana', 'anana', 'naan'].map(&:reverse).select { |f| !f.include?("a") }

代码执行以下操作:反转数组中的字符串并过滤包含字符“a”的所有字符串。

不清楚您的问题是什么。您是否在询问您发布的代码的作用,或者如何从包含字母“a”的数组中排除项

您发布的代码:

['banana', 'anana', 'naan'].map do |food|
       food.reverse
    end.select { |f| f.match /^a/ }
是否有下列情况:

首先,它创建一个新数组,每个元素都被反转(假设每个元素都是字符串)

所以

应生成如下数组:

["ananab", "anana", "naan"]
这是因为map获取数组中的每个元素并将其注入到块中

do |food| 
  food.reverse 
end 
如果每个元素都已“映射”到反转的字符串,则在每个元素上反转字符串并创建一个新数组

然后

 .select { |f| f.match /^a/ }
零件将从[“ananab”、“anana”、“naan”]创建另一个数组 包含以字母a开头的每个元素(/^a/表示以“a”开头)

导致数组

["ananab", "anana"] 
如果你的问题是如何排除包含字母a的单词,那么

['banana', 'anana', 'naan'].reject { |s| s.include?("a") }

应该做你想做的事(正如sawa指出的)

^
实际上意味着行的开始,而不是字符串的开始<代码>\A表示字符串的开头。类似地,
$
是行的结尾,而
\z
是字符串的结尾。对于后代来说,它实际上意味着行的开头或字符串的开头。所以,我们在技术上都是错的,尽管可以说,我错的更多。(但为了简单起见,这实际上是一个有意的选择。可能是被误导了。)@ceykooo但这仅仅是因为字符串的开头必须始终也是行的开头。我有点不同意。但这是一个哲学上的分歧。对于一根弦的末端来说更为模糊:弦的末端真的是一行的末端,还是根本就没有一行?我必须咨询我的精神委员会。@ceykooo正如AndrewMarchall所指出的,你对“我们在技术上都是错的”的描述是错误的。穆太短并没有错。只有你错了。如果你只是想排除那些带有字母“a”的字符串,为什么要反转这些字符串呢?我只重构了OP的代码。我只是信使。
['banana', 'anana', 'naan'].reject { |s| s.include?("a") }