2017-06-01 81 views
1

试图获得一切的一个懒惰的正则表达式匹配,直到句子的第一个句点。直到第一个句点为止,正则表达式匹配所有东西

例如只想得到“杰克和吉尔”。从这句话:
“杰克和吉尔上了山,拿了一桶。”

/.+\./匹配的整个句子(example
/(.+?\.)/比赛每个实例(example

有没有办法只匹配第一个实例?

+0

对于该演示网站使用插入符号^(。+?\。)' – revo

+0

对第二个模式使用'match'方法。 –

+0

就像@revo回答的那样,除非你想以某种方式将匹配放在捕获组中,否则它也可以没有括号[demo](https://regex101.com/r/tzaQhs/1/)。 – SWLim

回答

3
/^([^.]+)/ 

让我们把它分解,

  • ^是换行符锚

  • [^.]这,这不是一个时期

  • \+采取直到一段

    匹配任何字符

而表达式用()来封装它。

+1

*“^是字符串锚的开始”*:不,这是错误的,在Ruby中'^'匹配行的开始(不是字符串)。字符串起始处的锚点是'\ A' –

+1

请注意,当方括号内出现'.'时,它不需要转义。 '[\。]'与'[。]'相同。 (而且否定克拉不会改变这种情况。) – CAustin

+0

你是对的,我从来没有理由使用\ A,所以这个概念为我融合在一起。更新以反映这一点。 –

1

如果您只希望第一次出现,请不要选择返回字符串中所有结果的方法scan。您可以使用返回MatchData实例的匹配方法,但你也可以简单的写:

> "jack and jill. went up the hill. to fetch a pail."[/.+?\./] 
=> "jack and jill." 
0

我会倾向于使用正则表达式,但也有其他的选择。

str = "jack and jill. went up the hill. supposedly to fetch a pail of water." 
str[0..i] if i = str.index('.') 
    #=> "jack and jill." 

str = "three blind mice" 
str[0..i] if i = str.index('.') 
    #=> nil 
相关问题