正则表达式在Ruby中的句子中找到'a'或'an'

时间:2014-01-23 14:40:13

标签: ruby regex

我是Regex的初学者。我以为我会在没有帮助的情况下完成这项工作,但却无法完成。

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

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

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

/[(An)|(an)|a|A]\s+\w+[\s|.]/

捕获的对是:

'a sentence.', 'n egg ', 'a word.', 'A gee ', 'a word.', 'n is '.

以上模式无法完全捕获An egg。但是,更多奇怪它在'n is '中抓取了Ocean is

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

4 个答案:

答案 0 :(得分:2)

添加单词边界:

/\b(an?)\s+\w+/i

修改n不得为大写)

/\b([aA]n?)\s+\w+/

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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"
# ]

我们走了:/(?<=\A|\s)[Aa]n?\s+[A-Za-z]+/m

首先是在“海洋是”中不匹配“an is”的后视镜。然后我们寻找A(可能是大写),可能后跟“n”,然后是空格和单词本身。多行的最终m州。

为避免使用lookbehind,可以将regexp更改为:

/\b[Aa]n?\s+[A-Za-z]+/m

UPD 应该避免在\w使用\w,因为[A-Za-z0-9_]与{{1}}匹配,尤其是下划线。

答案 3 :(得分:0)

我会使用一个非常简单的模式,以及scan来查找所有出现的内容:

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"]

我正在使用x标志来提高模式的可读性。

模式分解为:

  • \b:一个字边界,只有"a""an"匹配。 (它不区分大小写。)
  • an?:匹配"a""an"
  • \s+:匹配一个或多个空格。
  • [a-z]+:仅匹配连续的字母。这很重要,因为使用\w字符类的任何模式也会匹配0..9和“_”(下划线)。您的示例不包含这些内容,但包含这些字符的任何文本都可能会给您带来不良后果。
  • i标志表示忽略大小写。 m标志表示将文本视为单行文本。通常,线端更重要。 x表示模式中的空格不重要,需要\s标记它们应该位于何处。

如果您想要尾随标点符号或空格,请将.添加到模式的末尾:

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