2009-07-15 70 views
6

我想在JavaScript的字符串中間拉出一個數字。在Ruby(我的主要語言),我這樣做:如何從JavaScript中的字符串中提取數字?

紅寶石:

name = "users[107][teacher_type]" 

num = name.scan(/\d+/).first 

但在JavaScript中我必須這樣做,這似乎有點笨重。

的JavaScript:

var name = "users[107][teacher_type]" 

var regexp = new RegExp(/\d+/) 

var num = regexp.exec(name)[0] 

有沒有辦法拔出匹配的部分,而建設一個RegExp對象?即Ruby的String#掃描的單行等價物?

此外,作爲一個方面說明,由於這個字符串將始終具有相同的格式,我可能會使用.replace。這不是一個聰明的解決方案,但我又在JavaScript中遇到了問題。

在Ruby:

num = name.gsub(/users\[|\]\[teacher_type\]/,"") 

但是當我嘗試這在JavaScript它不喜歡的或者|在正則表達式的中間():

在JavaScript:

//works 

num = name.replace(/users\[/, "").replace(/\]\[teacher_type\]/,"") 

//doesn't work 

num = name.gsub(/users\[|\]\[teacher_type\]/,"") 

任何人都可以設置我嗎?

+0

在Ruby中,你會怎麼做'的名字[/ \ d + /]`。如果你只對第一場比賽感興趣,那麼`String#scan`是錯誤的工具。 – 2017-10-25 20:29:51

回答

7

創建動態正則表達式時,您只需要使用new RegExp()部分。您可以在其他時間使用文字。/\ d + /相當於new RegExp("\\d+")。請注意,使用後者時必須轉義特殊字符。

另外值得注意的是String#match返回null或數組。根據所提供的解決方案(parseInt(name.match(/\d+/), 10)),這並不明顯。恰好在傳遞到parseInt時它會轉換爲字符串。 ParseInt將字符串值轉換爲整數(如果可能)。

name.match(/\d+/)[0] 
/\d+/.exec(name)[0] 

在這種情況下,這兩個在功能上是相同的。

您指的另一匹配(否定匹配)需要特殊標誌。要複製gsub的功能,您需要通過g標誌多次應用正則表達式。

'users[107][teacher_type]'.replace(/users\[|\]\[teacher_type\]/g,'') 

或者,如果你不得不使用new RegExp由於某種原因,你會完成與上面相同,像這樣:

「用戶[107] [teacher_type]」取代(新的RegExp('用戶\ [| \] \ [teacher_type \]','g'),'')

再次注意我是如何逃避所有反斜槓的。 Mozilla的開發者中心是一個很好的reference來熟悉JavaScript中的正則表達式。

1

如此簡單的JavaScript作爲Ruby中(或更簡單):

var num = name.match(/\d+/); 
1

你並不需要使用RegExp「構造函數」,除非您正在構建模式(通常通過字符串連接)。圖案文字是有效的(其實你發佈一個在你的片段,當正則表達式()實際上更喜歡一個字符串)

/\d+/.exec(name)[0] 

是完全有效的。

至於你的問題的第二部分,我認爲你只是有一個錯字。代替replace您仍然有gsub這是Ruby方法,而不是JavaScript方法。模式本身應該工作得很好。

3
var num = name.replace(/\D+/, ''); 

請注意,儘管此單線程不驗證名稱格式。它只是去掉所有非數字(\D\d相反)。

0

我個人認爲這是最好的。

function parseNumber (n) { 
    return Number(n.replace(/[^0-9\.-]+/g,"")) 
} 

// Examples 
parseNumber('4')  // 4 
parseNumber('4.00')  // 4 
parseNumber('$4.1s2') // 4.12 
parseNumber('')   // 0 
parseNumber(' ')  // 0 
parseNumber('$4.1s2.0') // NaN 

我也處理的輸入值,所以我做出這樣的功能:

function parseNum(n) { 
    // strip all whitespace before and after 
    n = String(n).trim() 
    // if number is '' or ' ' return empty string 
    if (!n) return '' 
    // remove everything except numbers and '.' 
    return n.replace(/[^0-9\.]+/g,"") 
} 

// Examples 
parseNum('ss10ss') // 10 
parseNum('ss1ss0ss') // 10 
parseNum('2.00')  // 2.00 
parseNum('$2.12')  // 2.12 
parseNum('$2.s0s0ss') // 2.00 
parseNum('')   // "" 
parseNum(' ')   // "" 
parseNum(4)   // 4