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.