2010-10-31 32 views
1

我在這裏進行研究以找到格式化用戶文本消息的最佳方式。用於漂亮格式化用戶文本的Javascript正則表達式

什麼,我想實現一個示例:

1)用戶發送此消息:

Doctor, 
I would like to have 
an appointment tomorrow morning.Please,call me! 

2)我的應用程序格式,這種文本輸出這樣的:

Doctor, I would like to have an appointment tomorrow morning. Please, call me! 

公告即:

  • trai林志玲和前導空格必須走了(像一些使用$.trim())兩個詞之間
  • 多餘的空格必須用一個空格代替
  • 新線,換行,製表符,<br>必須由一個空格
  • 點和逗號代替必須與下一個單詞分開(上午。請致電 - >上午。請叫)

這裏的東西,到目前爲止我有:

text.replace(/<(.|\n\r)*?>/g, '') 
.replace(/\s/g,' ') 
.replace(/<br>/g,' ') 
.replace(/ +/g,' '); 

這將是很好的融合在短短的一個模式的所有表達式。 有沒有更簡單的方法來做到這一點?

+0

你的問題與jquery無關,所以我將它更新爲更一般。 – mikerobi 2010-10-31 02:15:57

回答

1

二正則表達式(jsFiddle demo):

text.replace(/\s+|([.,])(?=\S)/g, '$1 ').replace(/^\s|\s$/g, '') 

其分解,它匹配或者:

  • 的一個或多個空白字符(換行,製表符,空間)
  • 的週期或後跟一個非空白字符的逗號(我們使用(?=正向查找)

並用一個空格(ASCII 32)代替它,在任何匹配的句點或逗號中留下$ 1。然後在第二個正則表達式中刪除任何前導或尾隨空白字符。第二個正則表達式是必需的,因爲向原始字符串添加空格的正則表達式必須在替換子字符串中具有空格,並且我們希望在開始或結尾處有空格

如果<br>問題,你最好把更換,使用上述對正則表達式的(.replace(/<br>/g, ' ')),但空格字符之前,如果你真的想在同一個正則表達式可以這樣做:(jsFiddle demo

text.replace(/(?:<br>|\s)+|([.,])(?=\S)(?!<br>)/g, '$1 ').replace(/^\s|\s$/g, '') 
+0

這個'[。,]'幫助了我。現在我使用這個'$(「#txtMessage」)。text($(「#txtMessage」)。text()。replace(/ <(.|\n\r)*?>/g,'').replace(/ \ s + |([。, !)))(?= \ S)/ g,'$ 1').replace(/^\ s | \ s $/g,'').replace(/ +/g,''));' – 2010-10-31 11:09:09

0

沒有測試過,但我相信這是等價的:

text.replace(/^\s+|\s+$/g, '') 
    .replace(/\s+|\s*<br>\s*/g,' ') 

編輯

我不明白爲什麼第一個表達式替換<>所以我離開它。

0

也許,但我不確定進一步減少它的好處。正則表達式已經有點難以閱讀了,所以以後在進行調試的時候,在邏輯上分解它會很有用。

0

text.replace(/\s/g,' ')替換任何空間,換行,垂直製表符,常規標籤,並且空間與空間

.replace(/<\s*br\s*\/*\s*>/g,' ')替換任何<br>, <br/>, <br /> <br /> <br //>(等)與空間

.replace(/\s{2,}/g,' ')替換任何雙鍵或多個空格空間一個空格

.replace(/^\s|\s$/,'') LTRIM + RTRIM(雖然因爲交替的,在性能方面它可以更好地分割成單獨的LTRIM和rtrims依賴於字符串的大小)

決賽:

text = text.replace(/\s/g,' ').replace(/<\s*br\s*\/*\s*>/g,' ').replace(/\s{2,}/g,' ').replace(/^\s|\s$/,''); 

你不能真正做到「一個模式」,因爲無論是前兩者已經連續留下兩個空間的潛力,當他們都做了,所以你需要總是有最後一個條款。