簡體   English   中英

Javascript正則表達式,用於格式化用戶文本

[英]Javascript regular expression for pretty formatting user text

我正在這里進行一項研究,以找到格式化用戶文本消息的最佳方法。

我正在嘗試實現的示例:

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!

注意:

  • 尾部和前導空格必須消失(類似於使用$.trim()
  • 兩個單詞之間的多余空格必須替換為一個空格
  • 新行,換行符,制表符和<br>必須替換為一個空格
  • 點和逗號必須與下一個單詞分開(早上。請致電->早上。請致電)

到目前為止,這里有一些內容:

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

最好將所有表達式合並為一種模式。 有更短的方法嗎?

在兩個正則表達式中( jsFiddle演示 ):

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

對其進行分解,它可以匹配:

  • 一個或多個空格字符(換行符,制表符,空格)
  • 后跟非空格字符的句點或逗號(為此,我們使用(?=正向超前)

並將其替換為一個空格(ASCII 32),在任何匹配的句點或逗號中均保留為$ 1。 然后,在第二個正則表達式中刪除所有開頭或結尾的空白字符。 第二個正則表達式是必需的,因為向原始字符串添加空格的正則表達式必須在替換子字符串中具有空格,並且我們不希望在開頭或結尾空格。

如果<br>重要,最好在使用上述對正則表達式( .replace(/<br>/g, ' ') )之前將其替換為空格字符,但是如果您確實希望這樣做,正則表達式:( jsFiddle演示

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

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

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

編輯

我不明白為什么第一個表達式替換了<>所以我省略了它。

也許可以,但是我不確定進一步減少它的好處。 正則表達式已經有些難以理解,因此在以后進行調試時,將其邏輯分解可能會很有用。

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和rtrim)

最后:

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

您實際上無法執行“一個模式”,因為前兩個中的任何一個都可能在完成時連續兩個空格,因此您需要始終使用last子句。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM