javascript tag中文 - / \ s / g和/ \ s+/ g之間有區別嗎?




head html (5)

當我們有一個包含空格字符的字符串時:

var str = '  A B  C   D EF ';

我們想從字符串中刪除空格(我們想要這個: 'ABCDEF' )。

這兩個:

str.replace(/\s/g, '')

還有這個:

str.replace(/\s+/g, '')

將返回正確的結果。

這是否意味著+在這種情況下是多餘的? 在這種情況下,這兩個正則表達式之間是否存在差異(例如,它們是否會以任何方式產生不同的結果)?

更新:性能比較 - /\s+/g更快。 見這裡: http://jsperf.com/s-vs-shttp://jsperf.com/s-vs-s


Answers

在匹配情況下,第一個將返回每個空格一個匹配,而第二個將返回每組空格的匹配。

結果是相同的,因為您要用空字符串替換它。 例如,如果用'x'替換它,結果會有所不同。

str.replace(/\s/g, '')將返回'xxAxBxxCxxxDxEF'

str.replace(/\s+/g, '')將返回'xAxBxCxDxEF'

因為\s匹配每個空格,用'x'替換每個空格, \s+匹配空格組,用單個'x'替換多個連續的空格。


+表示“一個或多個字符”,沒有加號表示“一個字符”。 在您的情況下,兩者都會產生相同的輸出。


在第一個正則表達式中, 每個空格字符都被逐字符替換,空字符串。

在第二個正則表達式中, 每個連續的空格字符串由於+而被替換為空字符串。

但是,就像0乘以其他任何東西是0一樣,似乎兩種方法都以完全相同的方式剝離空格。

如果將替換字符串更改為'#' ,則差異會變得更加清晰:

var str = '  A B  C   D EF ';
console.log(str.replace(/\s/g, '#'));  // ##A#B##C###D#EF#
console.log(str.replace(/\s+/g, '#')); // #A#B#C#D#EF#

\s表示“一個空格”, \s+表示“一個或多個空格”。

但是,因為你正在使用/g標誌(替換所有出現)並用空字符串替換,所以你的兩個表達式具有相同的效果。


ngRoute是由Angular團隊構建的模塊,提供基本的客戶端路由功能。 這個模塊為路由提供了一個相當強大的基礎,並且可以很容易地構建,以提供可靠的路由功能,如本博客文章所示 (請務必閱讀Ward Bell和Ben Nadel之間的評論,作者 - 他們是幾個角利)

ui-router將焦點從以URL為中心的路線轉移到應用程序“狀態”,這可能會或可能不會反映在url中。

ui-router添加的主要功能是嵌套狀態和命名視圖。

嵌套狀態允許您為應用程序的各個部分分離控制器邏輯。 一個非常簡單的例子就是一個應用程序,其頂部為主導航,左側為輔助導航列表,右側為內容。 沒有嵌套狀態,單個控制器通常必須處理輔助導航的顯示邏輯以及內容。 嵌套路由允許您分離這些問題。

命名的視圖是UI路由器的另一個附加功能。 使用ngRoute,您只能在頁面上使用單個ngView指令,而在ui-router中使用命名視圖可以指定多個ui-view指令,然後每個狀態都能夠影響名稱視圖的模板和控制器。 一個非常簡單的例子就是將應用程序的主要內容作為主視圖,然後再創建一個可以作為單獨UI視圖的頁腳欄。 在這種情況下,頁腳的控制器不再需要偵聽狀態/路由更改。

這個podcast插曲中可以找到ngRoute和ui-router的比較。

為了讓事情更加令人困惑,請關注Angular團隊預計將為Angular 1.5和2.0版發布的新“官方”路由模塊。 這將取代ngRoute模塊。 Here是新的路由器模塊的當前文檔 - 由於實現尚未最終確定,因此在本文中相當稀少。 here觀看關於這個模塊何時會被發布的更多消息。







javascript regex