Объяснение регулярных выражений - PullRequest
1 голос
/ 01 ноября 2009

Я смотрю код в букмарклете tumblr, и мне было любопытно, что сделал код ниже.

try{
    if(!/^(.*\.)?tumblr[^.]*$/.test(l.host))
        throw(0);
        tstbklt();
}

Может кто-нибудь сказать мне, что тестирует линия if? Я пытался расшифровать регулярное выражение, но не смог этого сделать.

Ответы [ 2 ]

5 голосов
/ 01 ноября 2009

Изначально, исключая специфику регулярного выражения, этот код:

if ( ! /.../.test(l.host) )

"если не регулярное выражение (l.host)" или "если l.host не соответствует этому регулярному выражению"

Таким образом, регулярное выражение должно правильно описывать содержимое текста l.host для условного сбоя и, таким образом, избегать выдачи ошибки.

На самом регулярном выражении:

^(.*\.)?tumblr[^.]*$

Это проверка на наличие tumblr, но только после любой строки, заканчивающейся на ., которая может существовать:

^       # start of line
(       # begin capturing group 1
.*      # match any (non-newline) character, as many times as possible, but zero allowed
\.      # match a literal .
)       # end capturing group 1
?       # make whole preceeding item optional
tumblr  # match literal text tumblr
[^.]*   # match any non . character, as many times as possible, but zero allowed
$       # match end of line


Я думал, что это тестирование, чтобы увидеть, был ли хост tumblr

Да, похоже, что это может быть предназначено для проверки, но если это так, то это неправильный способ сделать это.
Для этого первый бит должен быть чем-то вроде ^(?:[\w-]+\.)? для захвата буквенно-цифрового субдомена (?: - это группа без захвата, [\w-]+ - это по крайней мере 1 буквенно-цифровой знак подчеркивания или дефис), а последний бит либо \.(?:com|net|org)$, либо, возможно, как (?:\.[a-zA-Z]+)+$, в зависимости от того, насколько гибкой должна быть секция tld.

1 голос
/ 01 ноября 2009

Моя попытка сломать это. Однако я не специалист по регулярным выражениям:

if(!/ ^ (. .)? Tumblr [^.] $ /. Тест (l.host))

Эта часть на самом деле не является регулярным выражением, но говорит нам, что нужно выполнять if () только если этот тест не работает.

если (! / ^(.*\.)?tumblr [^.] * $ /. Тест (l.host))

Эта часть допускает любые символы перед словом tumblr, если за ними следует . Но это все необязательно (см. ? в конце)

если (! / ^ (. *.)? Tumblr **[^.]*$/**. Тест (l.host))

Далее он соответствует любому символу, кроме. и это *$ расширяет это, чтобы соответствовать любому символу впоследствии (таким образом, это не разрывается после 1), и это работает до конца строки.

Наконец, .test() проверяет его на соответствие текущему имени хоста или тому, что содержит l.host (я не знаком с букмарклетом tumblr)

По сути, похоже, что эта часть проверяет, чтобы увидеть, что если хост не является частью tumblr, то вывести это исключение.

С нетерпением жду, чтобы понять, как я ошибаюсь:)

...