2009-11-01 8 views
1

나는 tumblr 북마크릿의 코드를보고 있으며 아래 코드에서 무엇을했는지 궁금합니다.Regex 설명

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

사람이 라인이 테스트되고 어떤 경우 말해 줄래? 나는 정규 표현식을 해독하려했지만 그렇게 할 수 없었다.

답변

5

는이 코드가 얼마나 잘못보고 기대

"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)$이거나 tld 섹션이 얼마나 유연해야하는지에 따라 (?:\.[a-zA-Z]+)+$과 같습니다.

+0

프로세스를 표시하는 좋은 방법입니다. 내 방식보다 나아. 내 upvote를 벌어! – Bartek

+0

나는 호스트가 tumblr인지 테스트 해보고 있다고 생각했지만, (북마크 렛을 tumblr.com에서 실행하면서) 테스트했을 때 나는 전혀 다른 것을 보지 못했다. – SonnyBurnette

+0

그래, 그 일을하려고하는 것처럼 보일지도 모르지만 그게 의도라면 잘못된 것입니다. 나는 그것에 대해 약간의 추가 사항을 추가했다. (실제 URL 유효성 검사는 아마도 조금 더 복잡 할 것이다.) –

1

내 시도가 무너졌습니다. 나는 그러나 정규식 전문가는 아니지만 (.. )?

if(!/^텀블러 $/테스트 (l.host))

이 부분은 정말 정규식 아니다 [^.]. 이 테스트가 작동하지 않으면 if() 만 실행하도록 알려줍니다.

경우 (!/^(.*\.)?tumblr [^.] * $ /. 테스트 (l.host))

이 부분에 의해 한 그들이 준수로 텀블러 단어 앞에 모든 문자를 허용하는 . 그러나 이 모든 선택 사항입니다

경우 (마지막에 ? 참조) (!/(^. *.)? 텀블러 ** [^.]*$/ **. 테스트 (l.host는))

다음, 어떤 일치 문자를 제외하고. *$은 그 이후의 모든 문자와 일치하도록 확장하므로 (문자열은 1 이후에 손상되지 않습니다) 문자열의 끝까지 작동합니다.

마지막으로,

그래서 기본적으로는 그 부분이 있는지 확인하는 것처럼 보인다 (필자는 텀블러 북마크에 익숙하지 않아요)이 .test()는 현재 호스트 이름에 대해 테스트 보인다이든 l.host는 포함 호스트가 tumblr의 일부가 아니면 예외를 throw합니다.

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

"그렇지 않으면 regex.matches (l.host)"또는 : 나는 처음에 정규식의 세부 제외 :