2012-04-09 50 views
1

可能是一個簡單的問題,但我對正則表達式相當陌生。javascript正則表達式找到特定句子

給出了一個段落,我想找到一個特定的句子,以指定的單詞開始,並用其他的替換整個句子。

如何構建正則表達式來搜索以特定單詞開頭的句子,後面可以跟多個不同單詞並以.(句點)結尾。

例如,給定句子foo bar. foo3 bar3. foo2 bar2.,找到以foo3開頭的子字符串,具有任意數量的詞並以.結尾。

+0

如果句子以其他標點符號結尾(如'!'或'?')會怎麼樣?該句子是否可以包含十進制數或貨幣? – 2012-04-09 16:15:57

回答

3

事情是這樣的:

/(^|\.\s+)(foo3[^.]*\.)/ 

搜索標記上一句期間(或第一句的情況下,字符串的開頭),其次是空間,然後開始字符序列(在這種情況下,foo3),其後是所有非句號字符,導致該句子結束。

演示:http://www.rubular.com/r/ROl2odiDn5


這裏是如何替換句子可能會在實踐中實現:

var str = "foo bar. foo3 bar3. foo2 bar2."; 
var regex = /(^|\.\s+)(foo3[^.]*\.)/g; 
str = str.replace(regex, "$1new sentence."); 
alert(str); 

在這個例子中,我用正則表達式替換,並納入額外的匹配字符(期從前面的句子開始)通過$1,接着是替換舊句子的新句子。這確保段落中其他句子的狀態保持不變。還要注意,這個例子會更新所有匹配的句子,因爲我使用了/g(全局)標誌。如果您只想更改第一句,請刪除g,或者通過添加更多的開始單詞使您的句子更加具體。

演示:http://jsfiddle.net/qPxFp/2/

+1

如果這是段落中的第一句話,那就行不通了。 – 2012-04-09 15:54:56

+0

@KarlBielefeldt:好點,更新。 – mellamokb 2012-04-09 15:56:43

+0

謝謝你mellamokb!我稍微改變了正則表達式,並能夠抓住這句話。 '/(foo3 \ s [^。] * \。)'這是一個很棒的網站。感謝您的鏈接。 – bigbaeng 2012-04-09 16:01:36

0

最短/最有效的,我能想到的:

/foo3\b[^.]*\./ 

然而,有幾個問題:

  • 它將匹配到一個十進制數(如匹配foo3 contributed $4. from foo3 contributed $4.83 million to the campaign.
  • 它會在技術上匹配foo3在句子中的任何地方句末(如匹配I hate foo3's guts.foo3's guts.
  • 它不會允許在驚歎號或問號結束的句子,例如

下面的表達式修復這些事情 - 儘管這是一個有點低效率(通過在標點符號之後要求某種空白或字符串尾部):

/(^|[.!?]\s+)foo3\b.*?(?=[.!?](\s|$))[.!?]/ 

...用例如:$1Replacement sentence.