2016-09-14 39 views
0

我使用正則表達式來匹配包含特定字符串的文本中的整個句子。只要句子以任何類型的標點符號結束,這就工作得很好。但是,當句子在文本的末尾沒有任何標點符號時,它不起作用。正則表達式匹配到文本結尾

這是我目前的表現:

[^.?!]*(?<=[.?\s!])string(?=[\s.?!])[^.?!]*[.?!] 

作品爲:

這是一個句子。更多文字。

更多的文字:

不適合工作。這是

一個句子有沒有什麼辦法,使這個詞作爲意圖?我找不到任何「文字結尾」的字符類。

回答

0

文本的末尾由錨點$匹配,而不是字符類。

你有兩個問題需要解決:(1)這句話後直接結束,和(2)句子後但與最終的句子沒有標點符號的某個時候結束。

要做到這一點,您需要在string可選之後進行匹配,但將匹配的字符串錨定到字符串的末尾。這也意味着,在您識別出(可選)句尾標點符號後,您需要匹配後面的所有內容,以便字符串末尾的錨點匹配。

我的變化:採取一切string後,原來的正則表達式,並圍繞着它在(?:...)? - 在(?:...)是一個「非記憶」組,?使整個組可選。按照$來固定字符串的末尾。

在這一可選的組,你也需要做出最終的句子本身可選的,由簡單[.?!](?:[.?!].*)?代替 - 當然,在(?:...)是做一個「非記憶」組中,?使組可選 - 並且.*允許在找到句子結尾後儘可能匹配。

[^.?!]*(?<=[.?\s!])string(?:(?=[\s.?!])[^.?!]*(?:[.?!].*)?)?$ 
0

文本結尾的符號是$(並且,如果您需要,文本開始符號爲^)。

您可能不會通過將$添加到標點符號列表中來獲得所需內容(例如,[.?!$]);你會發現它可以更好地作爲替代選擇:([.?!]|$)

0

你的正則表達式對於你想實現的過於複雜。

只匹配一個詞,僅僅用

"\bstring\b" 

它將匹配起點,終點和任何非alphanum分隔符。

它適用於以下:

string is at the start 
this is the end string 
this is a string. 
stringing won't match (you don't want a match here) 
0

你應該在這個問題添加的語言,瞭解更多有關使用。

這裏是我的例子中使用javascript:

var reg = /^([\w\s\.]*)string([\w\s\.]*)$/; 
 

 
console.log(reg.test('This is a sentence with string. More text.')); 
 

 
console.log(reg.test('More text. This is a sentence with string')); 
 

 
console.log(reg.test('string'))

注:

*:匹配零次或更多次。

? :匹配零次或一次。

+:匹配一次或多次。你可以用*更換嗎?或者+如果你想要更多的定義。