2017-06-01 80 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 
相關問題