Ruby 正则表达式find';a';或';一个';用红宝石写的句子

Ruby 正则表达式find';a';或';一个';用红宝石写的句子,ruby,regex,Ruby,Regex,我是正则表达式的初学者。我原以为我可以在没有帮助的情况下完成这项工作,但做不到 我想从下面的句子中找到文章词对(其中文章必须是A或): 我使用了这个正则表达式模式: /[(An)|(an)|a|A]\s+\w+[\s|.]/ 捕获的对是: 'a sentence.', 'n egg ', 'a word.', 'A gee ', 'a word.', 'n is '. 上述模式无法完全捕获鸡蛋。然而,更奇怪的是,它在《海洋是》中捕获了'n is' 提取它的正确模式是什么?尝试简化为\b(An

我是
正则表达式的初学者。我原以为我可以在没有帮助的情况下完成这项工作,但做不到

我想从下面的句子中找到
文章词
对(其中文章必须是A或):

我使用了这个正则表达式模式:

/[(An)|(an)|a|A]\s+\w+[\s|.]/
捕获的对是:

'a sentence.', 'n egg ', 'a word.', 'A gee ', 'a word.', 'n is '.
上述模式无法完全捕获
鸡蛋。然而,更奇怪的是,它在《海洋是》
中捕获了
'n is'


提取它的正确模式是什么?

尝试简化为
\b(An | An | a | a)\w+\b
尝试简化为
\b(An | An | a | a)\w+\b

s = 'This is a sentence. An egg is a word. A gee another word.\nLast line is a word. Ocean is very big.'
s.scan /(?<=\A|\s)[Aa]n?\s+[A-Za-z]+/m
# => [
#   [0] "a sentence",
#   [1] "An egg",
#   [2] "a word",
#   [3] "A gee",
#   [4] "a word"
# ]
UPD应避免在此处使用
\w
,因为
\w
匹配
[A-Za-z0-9.
请特别注意下划线

UPD应避免在此处使用
\w
,因为
\w
匹配
[A-Za-z0-9.
请特别注意下划线。

添加单词边界:

/\b(an?)\s+\w+/i
编辑:
n
不得为大写)

添加单词边界:

/\b(an?)\s+\w+/i
编辑:
n
不得为大写)


我将使用一个非常简单的模式,以及
扫描
来查找所有出现的情况:

sentence = <<EOT
This is a sentence. An egg is a word. A gee another word. 
Last line is a word. Ocean is very big.
EOT

sentence.scan(/\b an? \s+ [a-z]+/imx)
# => ["a sentence", "An egg", "a word", "A gee", "a word"]

我将使用一个非常简单的模式,以及
扫描
来查找所有出现的情况:

sentence = <<EOT
This is a sentence. An egg is a word. A gee another word. 
Last line is a word. Ocean is very big.
EOT

sentence.scan(/\b an? \s+ [a-z]+/imx)
# => ["a sentence", "An egg", "a word", "A gee", "a word"]


您需要在这些匹配字符串周围包含单词边界。请参阅regex文档中的
\b
。例如,像`/\b[(An)|(An)| a | a]\b\s+\w+[\s |].]/你得到
n鸡蛋和
n是
的原因是你把它们混在一起了。它们在某些方面是相似的,但字符类只匹配单个字符–正则表达式的
[(An)|(An)| a | a]
部分基本上与
[Aan]
(a | a | n)
相同。您需要在这些匹配字符串周围包含单词边界。请参阅regex文档中的
\b
。例如,像`/\b[(An)|(An)| a | a]\b\s+\w+[\s |].]/你得到
n鸡蛋和
n是
的原因是你把它们混在一起了。它们在某些方面是相似的,但是字符类只会匹配一个字符–正则表达式的
[(An)|(An)| a | a]
部分基本上与
[Aan]
(a | a | n)
相同。查找速度慢吗?这解决了我的目的/\b[Aa]n?\s+\w+/m。任何你选择[A-Za-z]+?在这里,这一点都不重要。如果我的单词包含下划线:)?@ram更好,使用
/\p{Alpha}/
来匹配
é
ü
等内容。第二个单词使用反向查找和字符范围对我来说很糟糕。Ruby的regexp支持更多的语义结构。lookbehind慢吗?这解决了我的目的/\b[Aa]n?\s+\w+/m。任何你选择[A-Za-z]+?在这里,这一点都不重要。如果我的单词包含下划线:)?@ram更好,使用
/\p{Alpha}/
来匹配
é
ü
等内容。第二个单词使用反向查找和字符范围对我来说很糟糕。Ruby的正则表达式支持更多的语义结构。“a”可能是大写,而不是“n”。这也可以匹配“aN”或“aN”,但如果这不重要的话,这是最优雅/简单的解决方案。@mudasobwa the
i
ant end使其不区分大小写。@p11y感谢您的提示。我想重复一遍:“‘a’可能是大写,而不是‘n’@mudasobwa抱歉,我读错了:)你仍然可以做
/\b[Aa]n?\s+\w+//code>“a”可能是大写,而不是“n”。这也可能与“安”或“安”匹配,但如果这不重要的话,这是最优雅/简单的解决方案。@mudasobwa the
i
ant结尾使它不区分大小写。@p11y谢谢你的提示。我想重复一遍:“‘a’可能是大写,而不是‘n’”@mudasobwa对不起,我读错了:)你仍然可以做
/\b[Aa]n?\s+\w+/
sentence = <<EOT
This is a sentence. An egg is a word. A gee another word. 
Last line is a word. Ocean is very big.
EOT

sentence.scan(/\b an? \s+ [a-z]+/imx)
# => ["a sentence", "An egg", "a word", "A gee", "a word"]
sentence.scan(/\b an? \s+ [a-z]+ ./imx)
# => ["a sentence.", "An egg ", "a word.", "A gee ", "a word."]