2011-12-14 9 views
7

Wiele gotowych do użycia klas znaków jest dostępnych w wyrażeniach regularnych Perla, takich jak \d lub \S, lub nowych grokkenach Unicode, takich jak \p{P}, which matches punctuation characters.Użyj gotowej klasy znaków i ogranicz ją dalej.

Załóżmy teraz, że chciałbym dopasować wszystkie znaki interpunkcyjne \p{P} (całkiem sporo z nich, a nie coś, co chcesz wpisać ręcznie) - wszystkie oprócz jednego, wszystkie oprócz starej dobrej kommy (lub przecinka, ,).

Czy istnieje sposób, aby określić ten wymóg, nie rozszerzając poręcznej klasy postaci i zabierając kommę ręcznie?

+0

Znalazłem bardzo podobne pytanie, cóż, w zasadzie to samo pytanie: [Jak dopasować dowolną spację z wyjątkiem spoza Perl?] (Http://stackoverflow.com/a/6125137/269126) – Lumi

Odpowiedz

9
$ unichars -au '\p{P}' | wc -l 
598 

Podwójna negacja:

/[^\P{P},]/ 

$ unichars -au '[^\P{P},]' | wc -l 
597 

"A" poprzez uprzedzona/lookbehind:

/\p{P}(?<!,)/ 

$ unichars -au '\p{P}(?<!,)' | wc -l 
597 

unichars

+0

Świetnie, dzięki! Bardzo przydatne: twój link do skryptu 'unichars'. – Lumi

7

Spróbuj

[^\P{P},] 

To jest zanegowana klasa znaków, który pasuje niemal wymienionych znaków.

\P{P} zanegowane \p{P}

+0

Dzięki, I nie wiedziałem o '\ P {...}'. Sprytna sztuczka. – Lumi

Powiązane problemy