2009-07-15 11 views
6

Chcę wyciągnąć liczbę poza środek ciągu w JavaScript. W Ruby (moim głównym językiem) Chciałbym to zrobić:Jak wyciągnąć liczbę z ciągu znaków w JavaScript?

Ruby:

name = "users[107][teacher_type]" 

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

Ale w JavaScript Mam do tego, co wydaje się nieco niezgrabne zrobić.

JavaScript:

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

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

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

Czy istnieje sposób, aby wyciągnąć części pasujące bez budowania obiektu RegExp? To znaczy. ekwiwalent jednej linijki skanowania # Stringa?

Również, jak na marginesie, ponieważ ten ciąg będzie zawsze miał ten sam format, mógłbym potencjalnie zrobić to za pomocą .replace. To nie jest tak sprytne rozwiązanie, ale znowu mam problemy z JavaScriptem.

W Ruby:

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

Ale gdy próbuję to w JavaScript to nie podoba lub (|) w środku regex:

W javascript:

//works 

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

//doesn't work 

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

Czy ktoś może mnie ustawić prosto?

+0

W Ruby byś zrobił 'nazwa [/ \ d + /]'. "Ciąg # skanowania" jest niewłaściwym narzędziem, jeśli interesuje Cię tylko pierwszy mecz. –

Odpowiedz

7

Podczas tworzenia dynamicznych wyrażeń regularnych należy używać tylko części new RegExp(). Możesz używać literałów w innym czasie./\ d +/jest odpowiednikiem new RegExp("\\d+"). Zauważ, że musisz uciec od znaków specjalnych podczas używania tego ostatniego. Warto zauważyć, że String#match zwraca wartość null lub tablicę. Nie wynika to z dostarczonych rozwiązań (parseInt(name.match(/\d+/), 10)). Tak się składa, że ​​po przejściu na parseInt jest konwertowany na ciąg znaków. ParseInt konwertuje wartości ciągów na liczby całkowite (jeśli jest to możliwe).

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

Te dwa są funkcjonalnie identyczne w tym przypadku.

Drugi mecz, do którego się odnosiłeś (dopasowanie negatywne) wymaga specjalnej flagi. Aby powielić funkcjonalność gsub, musisz powiedzieć, że wyrażenie regularne zostanie zastosowane więcej niż raz z flagą g.

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

Lub jeśli trzeba było użyć new RegExp z jakiegoś powodu chcesz osiągnąć takie same jak powyżej tak:.

'użytkownicy [107] [teacher_type]' replace (nowy RegExp ("Users \ [| \] \ [teacher_type \] ',' g '),' ')

Zauważ, jak musiałem uciec od wszystkich ukośników. Centrum programistów Mozilli to dobry reference do zapoznania się z regex w javascript.

1

To tak proste w JavaScript jak w Ruby (lub nawet prostsza):

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

Można również określić przelicznika na liczbę używając parseInt(string, radix)

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

Nie trzeba używać "Konstruktor" RegExp, chyba, że ​​budujesz wzorzec w locie (zwykle poprzez konkatenację ciągów). literały wzoru są ważne (w rzeczywistości, pisał jeden we fragmencie, gdy RegExp() faktycznie preferuje ciąg)

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

jest całkowicie poprawny.

Co do drugiej części pytania, myślę, że po prostu masz literówkę. W miejsce replace nadal masz gsub, która jest metodą Ruby, a nie JavaScript. Sam wzór powinien działać dobrze.

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

Należy jednak pamiętać, że ten jeden wiersz nie sprawdza formatu nazwy. Po prostu usuwa wszystkie nie będące cyframi (\D będąc przeciwieństwem \d).

0

Osobiście uważam, że to jest najlepsze.

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 

Mam również do czynienia z wartością nakładów więc zrobiłem funkcję tak:

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 
Powiązane problemy