tl; dr
Po prostu dodaj spację w swojej klasie postaci .
^[a-zA-Z0-9_ ]*$
Teraz, jeśli chcesz być surowy ...
Powyższe nie jest dokładnie poprawne. Z uwagi na fakt, że *
oznacza zero lub więcej , pasowałoby do wszystkich następujących przypadków, których zwykle nie oznacza dopasowanie:
- Pusty ciąg „”.
- Ciąg złożony w całości ze spacji „”.
- Ciąg, który prowadzi i / lub prowadzi ze spacjami „Hello World”.
- Ciąg zawierający wiele spacji między słowami „Hello World”.
Początkowo nie sądziłem, że takie szczegóły są warte wniknięcia, ponieważ OP zadawał tak podstawowe pytanie, że wydawało się, że surowość nie jest problemem. Teraz, gdy pytanie zyskało popularność, chcę powiedzieć…
... użyj odpowiedzi @ stema .
Co moim zdaniem (bez użycia \w
) przekłada się na:
^[a-zA-Z0-9_]+( [a-zA-Z0-9_]+)*$
(Niezależnie od tego, proszę głosować na @stema).
Kilka rzeczy, na które należy zwrócić uwagę w związku z tą (i @ macierzystą) odpowiedzią:
Jeśli chcesz zezwolić na wiele spacji między wyrazami (powiedzmy, jeśli chcesz dopuścić przypadkowe podwójne spacje lub jeśli pracujesz z wklejonym tekstem z pliku PDF), dodaj +
po spacji:
^\w+( +\w+)*$
Jeśli chcesz zezwolić na tabulatory i znaki nowej linii (białe znaki), zamień spację na \s+
:
^\w+(\s+\w+)*$
Tutaj sugeruję +
domyślnie, ponieważ, na przykład, łamanie linii systemu Windows składa się z dwóch białych znaków w sekwencji \r\n
, więc musisz +
złapać oba.
Wciąż nie działa?
Sprawdź, jakiego dialektu wyrażeń regularnych używasz. * W językach takich jak Java musisz uciec swoje backslashy, IE \\w
i \\s
. W starszych lub więcej podstawowych języków i narzędzi, jak sed
, \w
i \s
nie są zdefiniowane, więc pisać je z klas postaci, np [a-zA-Z0-9_]
i [\f\n\p\r\t]
, odpowiednio.
* Wiem, że to pytanie jest oznaczonevb.net, ale w oparciu o ponad 25 000 wyświetleń, zgaduję, że to nie tylko ludzie napotykają to pytanie. Obecnie jest to pierwsze trafienie w Google dla wyszukiwanego wyrażenia, słowa w przestrzeni wyrażeń regularnych .
Jedną z możliwości byłoby po prostu dodanie spacji do twojej klasy postaci, jak sugerował acheong87, zależy to od tego, jak surowo jesteś na swoim wzorcu, ponieważ pozwoliłoby to również na ciąg rozpoczynający się od 5 spacji lub ciągi składające się tylko ze spacji.
Inną możliwością jest zdefiniowanie wzoru:
Użyję
\w
tego jest w większości smaków regexowych takich samych jak[a-zA-Z0-9_]
(w niektórych jest oparty na Unicode)Umożliwi to serię co najmniej jednego słowa, a słowa zostaną podzielone spacjami.
^
Dopasuj początek łańcucha\w+
Dopasuj serię co najmniej jednego znaku słowa( \w+)*
to grupa powtarzana 0 lub więcej razy. W grupie oczekuje spacji, po której następuje seria co najmniej jednego znaku słowa$
dopasowuje koniec łańcuchaźródło
Ten działał dla mnie
źródło
Spróbuj z:
Wyjaśnienie:
źródło
ggggggggggggggggggggggggggggggggggggg;
, regex zajmie bardzo dużo czasu, aby osiągnąć wynik z powodu nadmiernego cofania.Zakładam, że nie chcesz początkowej / końcowej przestrzeni. Oznacza to, że musisz podzielić wyrażenie regularne na „pierwszą postać”, „rzeczy na środku” i „ostatnią postać”:
lub jeśli używasz składni podobnej do perla:
Ponadto: jeśli celowo sformułowałeś wyrażenie regularne, że pozwala on również na puste ciągi, musisz uczynić całą rzecz opcjonalną:
Jeśli chcesz zezwolić tylko na pojedyncze znaki spacji, wygląda to nieco inaczej:
To dopasowuje 0.. słów, po których następuje pojedyncza spacja, plus jedno słowo bez spacji. I sprawia, że całość jest opcjonalna, aby umożliwić puste ciągi.
źródło
\s
nie są równoważne.\s
pasuje więcej niż tylko przestrzeń.To wyrażenie regularne
pozwoli tylko jedną spację między słowami i nie będzie spacji wiodących ani końcowych.
Poniżej znajduje się wyjaśnienie wyrażenia regularnego:
^
Potwierdź pozycję na początku łańcucha\w+
Dopasuj dowolny znak słowa[a-zA-Z0-9_]
+
od jednego do nieograniczonego czasu, tyle razy, ile to możliwe, zwracając w razie potrzeby [chciwy](\s\w+)*
*
od zera do nieograniczonej liczby razy, tyle razy, ile to możliwe, zwracając w razie potrzeby [chciwy]\s
Dopasuj dowolny biały znak[\r\n\t\f ]
\w+
Dopasuj dowolny znak słowa[a-zA-Z0-9_]
+
od jednego do nieograniczonego czasu, tyle razy, ile to możliwe, zwracając w razie potrzeby [chciwy]$
Potwierdź pozycję na końcu łańcuchaźródło
To nie pozwala na miejsce na początku. Ale pozwala na spacje między słowami. Pozwala również na znaki specjalne między słowami. Dobry regex dla pól FirstName i LastName.
źródło
Tylko dla alfabetów:
W przypadku wartości alfanumerycznych i
_
:źródło
Spróbuj tego: (wersja Python)
zmień górny limit na podstawie zestawu danych
źródło
Po prostu dodaj spację do końca wzoru regularnego w następujący sposób:
źródło
Przyjrzał się wielu z tych rzekomych odpowiedzi ...
... i bupki po przeszukaniu Przepełnienia stosu, a także innych witryn dla wyrażenia regularnego, które pasuje do dowolnego ciągu bez początkowych lub końcowych białych znaków i tylko jedną spację między wyrazami ściśle alfanumerycznymi.
W ten sposób łatwo można go zmienić na alfanumeryczny:
(To nie pasuje do pojedynczych słów, ale po prostu użyj przełącznika / if-else z prostym,
^[a-zA-Z0-9]+$
jeśli chcesz dodatkowo złapać pojedyncze słowa.)ciesz się: D
źródło
[(?<=\d\s]
dopasowuje jeden znak:(
,?
,<
,=
, cyfra lub znak spacji, i że nie może być to, co masz na myśli. Jeśli miałby to być wygląd, powinien(?<=\d\s)
, ale nie ma sensu; regex nigdy by się nie zgadzał.Uważam, że ten działa dobrze dla „FullName”:
źródło
próbować .*? aby pozwolić na białe przestrzenie, zadziałało to dla mnie
źródło
.
pasuje do wszystkiego. Jest bardzo prawdopodobne, że nie będzie to rozwiązanie tutaj.