2014-06-10 56 views
0

我有正則表達式文本替換,搜索/\*\[(.*?)\]\*/ig模式並將其替換爲'<span style="font-size: 14px;">$1</span>'。這個工程用一個簡單的javascript 取代函數。正則表達式檢查單詞是否在句子中或外部

text = text.replace(/\*\[(.*?)\]\*/ig, '<span style="font-size: 14px;">$1</span>'); 

但是,我想知道模式是否在一個句子中,並相應地設置字體大小。

情景句1:

This is a text with the *[pattern]* inside the sentence. 

這裏*[pattern]*'<span style="font-size: 14px;">$1</span>'更換。請注意,字體大小爲14px,因爲該模式位於該句子中。這同樣適用於以下情形:

*[pattern]* in the beginning. 

End with a *[pattern]* 
在下列情況下,其中 模式不是句子

不過,我想字體大小要大些,讓我們說30PX 。這將適用於以下情況:有空間,但不換句話說

*[pattern]* 

Text and then the pattern in the new line 
*[pattern]* 

*[pattern]* 

這裏第三屆一個代表。

基本上,如果模式是從一​​個句子中分離出來的,我希望它有更大的字體大小。有什麼建議麼?

回答

4

您可以使用這樣一個前瞻:

/\*\[(.*?)\]\*(?=[^.\n]*\.)/g 

的模式 「內部」 的句子。同樣,

/\*\[(.*?)\]\*(?=[^.\n]*(\n|$))/g 

「外」的。

http://jsfiddle.net/RCD83/

+0

看起來不錯!我嘗試了很多測試用例。然而這在一個案例中失敗了:'以* [pattern] *'結尾。這裏模式是在一個句子中,但由於句子不以'。'結尾,所以第一個表達式失敗。爲了解決這個問題,第一個表達式應該看起來像這樣:'/ \ * \ [(。*?)\] \ *(?= [^。\ n] * [\ w \。])/ g'? – pewpewlasers

0

這裏有一個簡單的方法用一個正則表達式來做到這一點。我們將使用捕獲組。

別讓長度嚇唬你:這僅僅是一個模式,由兩個(?:non-capturing groups)

^(?:([ \t]*?)|([^\r\n]*?))\*\[[^\]]*\]\*(?:([ \t]*?)|([^\r\n]*?))$ 
  1. 捕獲組1包圍是那麼*[pattern]*之前,當它包含的不僅僅是空間或部分標籤。
  2. 當捕獲組2包含的空間或選項卡不僅僅是空格或製表符時,捕獲組2就是*[pattern]*之後的部分。

在此demo for the regex中,查看右下方窗格中的捕獲組。

如何使用它?

在您的替換lambda中,只需測試組1和組2的長度。如果它大於零,請執行一種替換。否則,做另一個。

我不會寫代碼的你,但這裏是一個替代的λ的樣子:

replaced = subject.replace(regex, function(m, group1, group2) { 
    if (group1 or group2 meet some magic code...) return some span around m; 
    else return some other span around m;; 
}); 
相關問題