2013-05-22 3 views
1
^[[:space:]]*@ 

Я не могу понять, что означает [[:space:]]* в приведенном выше регулярном выражении. Пожалуйста, помогите, спасибо!, пожалуйста, объясните это обычное выражение

+0

является 'space' буквально пробел или просто слово? – Bill

+0

Это слово. Я видел это регулярное выражение из кода других людей, но не могу его понять. – Runner

+0

@mclaassen Это не связано. Это класс символов POSIX, поддерживаемый Perl, чтобы позволить редакторам регулярных выражений лучше соответствовать Unicode. –

ответ

4

Это класс символов POSIX, в этом случае Unicode-дружественный способ представления «любой символ пробела».

См. this page, прокрутите вниз до «Классы символов POSIX».

+0

POSIX предопределяет Unicode с большим отрывом. Обоснование для классов абстрактного характера (мой специальный термин, не помню официальной терминологии) в большей степени относится к переносимости по локалям и наборам символов. – tripleee

9

[:space:] является POSIX character class который соответствует All whitespace characters, including line breaks в слове.

Другими словами [:space:] идентичен \s (с Perl 5.18 [1])

http://www.regular-expressions.info/posixbrackets.html


  1. Перед 5.18, вкладка вертикальной (U + 000B) WASN» т включенных в \s.

    $ diff -u <(unichars -au '\s') <(unichars -au '[[:space:]]') \ 
        && echo 'no difference' 
    --- /dev/fd/63 2013-05-21 22:08:03.000000000 -0400 
    +++ /dev/fd/62 2013-05-21 22:08:03.000000000 -0400 
    @@ -1,5 +1,6 @@ 
        ---- U+00009 CHARACTER TABULATION 
        ---- U+0000A LINE FEED (LF) 
    + ---- U+0000B LINE TABULATION 
        ---- U+0000C FORM FEED (FF) 
        ---- U+0000D CARRIAGE RETURN (CR) 
        ---- U+00020 SPACE 
    
+0

Спасибо @ikegami – Bill

+0

'\ s' также не всегда соответствует U + 00A0, неразрывному пространству. '/ u' уверен, что это так. '/ a' гарантирует, что это не так. – ikegami

0

Существует несколько способов выражения таких вещей, как «символ пробела», и это один из них. Набор [...] позволяет включить такие вещи, как [:space:], чтобы добавить символы пробела в набор.

Это гласит:

^ # At the beginning of string... 
[[:space:]]* # ...zero or more whitespace characters... 
@ # ...followed by an at sign. 
+0

Не пробельные символы, * пробельные символы *. Возможно, это то, что вы имели в виду, но точная терминология в этом случае важнее обычного, потому что многие начинающие регулярные лица начинают полагать, что '\ s' и/или' [[: space:]] '* do * соответствуют только символу пробела ('0020' U +). –

+0

Пробел - лучший термин, скорректированный соответствующим образом. – tadman