我是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
。
提取它的正确模式是什么?
答案 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."]