2009-09-30 17 views
23

Jaki jest najlepszy sposób sprawdzenia, czy pojedynczy znak jest białą przestrzenią?Sprawdź, czy pojedynczy znak jest białą przestrzenią?

Wiem, jak to sprawdzić poprzez wyrażenie regularne.

Ale nie jestem pewien, czy to najlepszy sposób, jeśli mam tylko jedną postać.

Czy nie istnieje lepszy sposób (w odniesieniu do wydajności) do sprawdzenia, czy jest to biały znak?

Jeśli zrobię coś takiego, to tęsknię spacji jak kartach I quess ?: if (ch == ' „) { .... }

+1

Używam ((c <= 32 && c > = 0) || c == 127).Pobiera wszystkie białe spacje i kontroluje znaki w ascii. – nikdeapen

Odpowiedz

6

ten obejmuje spacji, tabulacji i nowego wiersza :

if ((ch == ' ') || (ch == '\t') || (ch == '\n')) 

to powinno być najlepsze dla wydajności. Najpierw umieść biały znak, który najprawdopodobniej będzie najbardziej prawdopodobny.

jeśli wydajność jest bardzo ważne, chyba najlepiej rozważyć większy obraz niż poszczególnych operacji, takich jak ten ...

+0

są też "\ r" i "\ r \ n", ale powiedziałabym, że lepiej użyć wyrażenia regularnego niż użyć warunku jeśli 5. W mojej opinii byłoby to szybsze. – stefita

+0

cóż, zawsze najlepiej jest profilować w takich przypadkach. w zależności od tego, jak prawdopodobna jest każda postać, zwarcie '||' może przyspieszyć działanie. – Peter

+1

To mogłoby zrobić funkcję isWhiteSpace (ch) {return "\ t \ n \ r \ v" .indexOf (ch)! = -1; } – Locksfree

11

mam odwoływać zestaw białych znaków dobranych przez trim funkcji PHP bez wstydu (minus zerowy bajt, Nie mam pojęcia, jak dobrze poradzą sobie z tym przeglądarki).

if (' \t\n\r\v'.indexOf(ch) > -1) { 
    // ... 
} 

Wygląda to jednak na przedwczesną optymalizację.

+4

+1 do przedwczesnej optymalizacji. – Glenn

+0

Wygląda na to, że jest to odrobinę szybsze niż użycie RegExp: http://jsperf.com/whitespace-character – Azmisov

29

Jeśli chcesz tylko przetestować dla niektórych białych znaków, należy to zrobić ręcznie, w przeciwnym razie, należy użyć wyrażenia regularnego, czyli

/\s/.test(ch) 

Należy pamiętać, że różne przeglądarki dopasować różne postacie, np Firefox, \s jest równoważny (source)

[ \f\n\r\t\v\u00A0\u2028\u2029] 

natomiast w programie Internet Explorer, należy (source)

[ \f\n\r\t\v] 

Na stronie MSDN faktycznie zapomniałem przestrzeń;)

+0

@kangax: miło wiedzieć; przynajmniej dla IE, dokumentacja jest zgodna z faktycznym wynikiem (brakujące miejsce na boki). – Christoph

+3

zauważ, że obie połączone strony zostały zaktualizowane od tego czasu - MSDN-a teraz zawiera spację, a Mozilla zawiera dodatkowe znaki białe znaki Unicode. – Christoph

1
var testWhite = (x) { 
    var white = new RegExp(/^\s$/); 
    return white.test(x.charAt(0)); 
}; 

Ta mała funkcja pozwoli Ci wprowadzić ciąg znaków o zmiennej długości jako argument i będzie to zgłosić „true”, jeśli pierwszy znak jest biała przestrzeń lub "fałsz" w przeciwnym razie. Możesz łatwo wstawić dowolny znak z łańcucha do funkcji za pomocą metod indexOf lub charAt. Przykłady:

var str = "Today I wish I were not in Afghanistan."; 
testWhite(str.charAt(9)); // This would test character "i" and would return false. 
testWhite(str.charAt(str.indexOf("I") + 1)); // This would return true. 
7

Podejście do regex to solidna droga. Ale tutaj jest to, co robię, gdy jestem leniwy i zapomnieć o prawidłowej składni regex:

str.trim() === '' ? alert('just whitespace') : alert('not whitespace'); 
0

jak o tym jednym: ((1L < < ch) & ((ch - 64) >> 31) & 0x100002600L)! 0L

+0

Przepraszamy, ale to nie jest javascript. To jest C. A to jest pytanie o javascript. –