Regex, każdy znak niealfanumeryczny z wyjątkiem białych znaków lub dwukropka


140

Jak mogę to zrobić gdziekolwiek?

Zasadniczo próbuję dopasować wszystkie rodzaje różnych znaków, takich jak ampersandy, średniki, znaki dolara itp.


16
/[^a-zA-Z0-9\s\:]*/
Kelly

Odpowiedzi:


263
[^a-zA-Z\d\s:]
  • \ d - klasa numeryczna
  • \ s - spacja
  • a-zA-Z - dopasowuje wszystkie litery
  • ^ - neguje je wszystkie - więc otrzymujesz - znaki nienumeryczne, bez spacji i bez dwukropków

Właśnie na to też patrzyłem :)) - muszę promować Twoją idealną odpowiedź
Tudor Constantin

8
Jedyne, co znalazłem, to to, że usuwa to znaki specjalne, takie jak é lub ã. Wolałbym [^ \ w \ d \ s:].
Eric Belair

5
Głos odrzucony, ponieważ nie spowoduje to przechwycenia znaków spoza alfabetu łacińskiego ani „specjalnych” znaków łacińskich.
damian

\di \ssą rozszerzeniami Perl, które zazwyczaj nie są obsługiwane przez starsze narzędzia, takie jak grep, sed, tr, lex, itp
tripleee

39

To powinno wystarczyć:

[^a-zA-Z\d\s:]

1
Reszta albo sprawdza spację, ale nie białą spację, albo ma negację w niewłaściwym miejscu, aby faktycznie zanegować.
Zachary Scott

\ w również łapie podkreślenia - czyli znak niealfanumeryczny
Tudor Constantin

Aha! Zmodyfikuję - tego nie wiedziałem. Spodziewam się, że działa to inaczej dla różnych silników, ale równie dobrze może dać OP bezpieczną odpowiedź.
Luke Sneeringer

2
Głos odrzucony, ponieważ nie spowoduje to przechwycenia znaków spoza alfabetu łacińskiego ani „specjalnych” znaków łacińskich.
damian

17

Jeśli chcesz traktować akcentowane znaki łacińskie (np. À Ñ) jak zwykłe litery (tzn. Unikaj też ich dopasowywania), musisz również uwzględnić w swoim wyrażeniu regularnym odpowiedni zakres Unicode ( \ u00C0- \ u00FF ), więc wyglądałoby tak:

/[^a-zA-Z\d\s:\u00C0-\u00FF]/g
  • ^ neguje to, co następuje
  • a-zA-Z dopasowuje duże i małe litery
  • \d dopasowuje cyfry
  • \s dopasowuje białe znaki (jeśli chcesz dopasować tylko spacje, zamień to na spację)
  • : pasuje do dwukropka
  • \u00C0-\u00FF pasuje do zakresu Unicode dla akcentowanych znaków łacińskich.

nb. Dopasowanie zakresu Unicode może nie działać dla wszystkich silników regex, ale powyższe z pewnością działa w Javascript (jak widać na tym piórze w Codepen).

nb2. Jeśli nie przejmujesz się dopasowywaniem podkreśleń, możesz zastąpić a-zA-Z\dje \wliterami, cyframi i podkreśleniami.


Ten zakres zawiera znaki, które nie są alfanumeryczne (U + 00D7 i U + 00F7) i wyklucza wiele poprawnych znaków akcentowanych z języków innych niż zachodnie, takich jak polski, czeski, wietnamski itp.
tripleee

1
Głosowano za opisem każdej części RegEx.
morajabi

15

Spróbuj tego:

[^a-zA-Z0-9 :]

Przykład JavaScript:

"!@#$%* ABC def:123".replace(/[^a-zA-Z0-9 :]/g, ".")

Zobacz przykład online:

http://jsfiddle.net/vhMy8/


3
Głos odrzucony, ponieważ nie spowoduje to przechwycenia znaków spoza alfabetu łacińskiego ani „specjalnych” znaków łacińskich.
damian

15
Łatwo jest odrzucić odpowiedź, a jeszcze trudniej przekazać tablicy konstruktywne informacje, np. Jak można wtedy wyłapać znaki spoza alfabetu łacińskiego lub „specjalne” znaki łacińskie? Z tego samego powodu, według moich obliczeń, obniżyłeś 3 odpowiedzi z tego samego powodu i moim zdaniem za niewielką poprawkę. Na przykład jestem tutaj, aby znaleźć wyrażenie regularne dla dokładnie tego, co jest omówione w tych odpowiedziach. Nie obchodzą mnie zestawy znaków, które nie będą używane w mojej aplikacji. Prawo malejących przychodów.

1
Aaron może być „drobną poprawką” dla obywatela USA, ale bardzo istotny dla… reszty tej planety.
Michael K. Borregaard

[^a-zA-Z0-9 :]można zastąpić[^\w:]
Moses Schwartz


4

Jeśli masz na myśli „znaki niealfanumeryczne”, spróbuj użyć tego:

var reg =/[^a-zA-Z0-9]/g      //[^abc]

1

To wyrażenie regularne działa w językach C # , PCRE i Go, żeby wymienić tylko kilka.

Z tego, co mówi RegexBuddy, nie działa dla JavaScript w Chrome . Ale jest na to już przykład.

Ta główna część to:

\p{L}

który reprezentuje \p{L}lub \p{Letter}dowolny rodzaj listu z dowolnego języka. "


Samo pełne wyrażenie regularne: [^\w\d\s:\p{L}]

Przykład: https://regex101.com/r/K59PrA/2


Jest to jedyna odpowiedź, która poprawnie radzi sobie z alfabetem akcentowanym przez Unicode. Niestety, nie wszystkie silniki wyrażeń regularnych obsługują tę funkcję (nawet Python nie ma go w wersji 3.8, mimo że jego silnik regex jest rzekomo oparty na PCRE).
tripleee

1
Usunę Pythona z odpowiedzi, myślałem, że to przetestowałem, ale najwyraźniej nie. Dzięki za zwrócenie uwagi.
Ste

0

Spróbuj dodać to:

^[^a-zA-Z\d\s:]*$

To zadziałało dla mnie ... :)


Wydaje się, że to powtórzenie zaakceptowanej odpowiedzi z 2011 roku. Zakotwiczenia ^i $ograniczają ją do dopasowania całych linii, a *kwantyfikator oznacza, że ​​dopasowuje również puste linie.
tripleee

0

W JavaScript:

/[^\w_]/g

^negacja, czyli wybierz wszystko, czego nie ma w następującym zestawie

\w dowolny znak słowa (tj. dowolny znak alfanumeryczny plus podkreślenie)

_ zaneguj podkreślenie, ponieważ jest uważane za znak „słowa”

Przykład użycia - const nonAlphaNumericChars = /[^\w_]/g;

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.