2009-07-15 19 views
6

Ich möchte eine Nummer aus der Mitte einer Zeichenfolge in JavaScript ziehen. In Ruby (meine Hauptsprache) Ich würde dies tun:Wie kann man in JavaScript eine Zahl aus einer Zeichenkette ziehen?

Rubin:

name = "users[107][teacher_type]" 

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

Aber in JavaScript Ich habe, dies zu tun, was ein bisschen klobig zu sein scheint.

JavaScript:

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

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

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

Gibt es Weg, um die passenden Teile zu ziehen, ohne ein RegExp-Objekt zu bauen? I.e. ein One-Liner-Äquivalent von Ruby's String # Scan?

Auch als Randnotiz, da diese Zeichenfolge immer das gleiche Format haben, könnte ich es möglicherweise mit .replace tun. Das ist keine so clevere Lösung, aber ich habe wieder Probleme mit JavaScript.

In Ruby:

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

Aber wenn ich dies in JavaScript versuchen, funktioniert es nicht wie die oder (|) in der Mitte der Regex:

In JavaScript:

//works 

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

//doesn't work 

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

Kann mich jemand gerade setzen?

+0

In Ruby würden Sie tun 'Name [/ \ d + /]'. 'String # scan' ist das falsche Werkzeug, wenn Sie nur am ersten Spiel interessiert sind. –

Antwort

7

Sie müssen nur den new RegExp() Teil verwenden, wenn Sie dynamische reguläre Ausdrücke erstellen. Sie können Literale zu anderen Zeiten verwenden./\ d +/ist das Äquivalent von new RegExp("\\d+"). Beachten Sie, dass Sie bei der Verwendung von Sonderzeichen Sonderzeichen vermeiden müssen.

Bemerkenswert ist auch, dass String#match Null oder ein Array zurückgibt. Dies ist aufgrund der mitgelieferten Lösungen nicht ersichtlich (parseInt(name.match(/\d+/), 10)). Es passiert einfach, dass es in eine Zeichenfolge konvertiert wird, wenn es an parseInt übergeben wird. ParseInt konvertiert Zeichenfolgenwerte in ganze Zahlen (wenn möglich).

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

Diese beiden sind in diesem Fall funktionell identisch.

Die andere Übereinstimmung, auf die Sie sich bezogen haben (die negative Übereinstimmung), erfordert eine spezielle Markierung. Um die Funktionalität von gsub zu duplizieren, müssen Sie dem Regex mitteilen, dass er mehrmals mit dem Flag g angewendet werden soll.

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

Oder wenn Sie new RegExp aus irgendeinem Grunde zu verwenden, haben würden Sie das gleiche wie oben wie so erreichen.

'Benutzer [107] [teacher_type] ersetzen (neuer RegExp (' users \ [| \] \ [Lehrer_Typ \] ',' g '),' ')

Beachten Sie noch einmal, wie ich alle Backslashes entkommen musste. Mozilla's Developer Center ist eine gute reference, um sich mit Regex in Javascript vertraut zu machen.

1

Es in JavaScript so einfach wie in Ruby (oder noch einfacher):

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

Sie brauchen nicht zu verwenden angeben der RegExp- "Konstruktor", es sei denn, Sie erstellen das Muster im laufenden Betrieb (normalerweise über eine String-Verkettung). Muster Literale sind gültig (in der Tat, Sie auf dem Laufenden in Ihrem Snippet, wenn RegExp() zieht es tatsächlich eine Zeichenfolge)

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

ist vollkommen gültig.

Zum zweiten Teil Ihrer Frage, ich denke, Sie haben nur einen Tippfehler. Anstelle von replace haben Sie immer noch gsub, was die Ruby-Methode ist, keine JavaScript-Methode. Das Muster selbst sollte gut funktionieren.

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

Beachten Sie jedoch, dass dieser One-Liner das Namensformat nicht validiert. Es löscht nur alle Nicht-Ziffern (\D ist das Gegenteil von \d).

0

Ich persönlich denke, das ist das Beste.

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 

Ich bin auch mit dem Wert der Eingänge zu tun, damit ich eine Funktion wie folgt aus:

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 
Verwandte Themen