2009-07-17 5 views
2

의 내가 텍스트 파일에 모든 URL을 찾아 제대로 작동 정규 표현식 있다고 가정 해 봅시다 :정규 표현식의 역함을 얻는 방법?

(http://)([a-zA-Z0-9\/\.])* 

내가 원하는 것은 URL을하지만, 역이 아닌 경우 - URL을 제외한 다른 모든 텍스트 - 인을 이걸 만들 수있는 쉬운 수정이 있습니까?

+1

문맥에 대한 원래 질문 (http://stackoverflow.com/questions/1140921/regex-to-strip-out-image-urls)에 대한 링크를 포함해야합니다. – Lee

답변

4

,이 시도 :

((?<=http://[a-zA-Z0-9\/\.#?/%]+(?=[^a-zA-Z0-9\/\.#?/%]))|\A(?!http://[a-zA-Z0-9\/\.#?/%])).+?((?=http://[a-zA-Z0-9\/\.#?/%])|\Z) 

을 조금 ([a-zA-Z0-9\/\.#?/%])는 몇 가지 중요한 것들을 포함하는 URL 문자 세트를 확장 , 그러나 이것은 결코 정확한 또는 철저한 의미는 아닙니다.

정규식 괴물의 비트, 그래서 그것을 파괴하려고합니다 :

(?<=http://[a-zA-Z0-9\/\.#?/%]+(?=[^a-zA-Z0-9\/\.#?/%]) 

첫 번째 물약은 URL의 끝을 일치합니다. http://[a-zA-Z0-9\/\.#?/%]+은 URL 자체와 일치하지만 (?=[^a-zA-Z0-9\/\.#?/%])은 URL이 URL이 아닌 문자로 이어져야한다는 것을 주장하므로 우리는 끝에 있다는 것을 확신합니다. 미리보기는 URL 이외의 문자를 찾지 만 캡처하지 못하도록하기 위해 사용됩니다. 모든 것은 lookbehind (?<=...)에 래핑되어 해당 부분을 캡처하지 않고 다시 일치의 경계로 찾습니다.

또한 파일 시작 부분의 URL이 아닌 URL과 일치 시키려고합니다. \A(?!http://[a-zA-Z0-9\/\.#?/%])은 파일의 시작 부분 (\A)과 일치하며, 파일 시작 부분에 URL이 숨어 있지 않은지 확인하기 위해 부정적인 미리보기가옵니다. (이 URL 확인은 URL의 시작 부분 만 필요하기 때문에 처음 것보다 간단합니다.)

두 검사는 모두 괄호로 묶어 | 문자와 함께 OR '에 넣습니다. 그 후에 .+?은 캡처하려는 문자열과 일치합니다.

그런 다음 우리는 ((?=http://[a-zA-Z0-9\/\.#?/%])|\Z)에 왔습니다. 여기서는 URL의 시작을 확인하고 다시 (?=http://[a-zA-Z0-9\/\.#?/%])으로 확인합니다. 파일의 끝 부분은 우리가 경기가 끝났을 때 나타나는 좋은 징조이기도하므로 \Z을 사용하여이를 찾아야합니다. 첫 번째 큰 그룹과 마찬가지로 괄호로 묶고 OR 두 가지 방법을 함께 사용합니다.

기호의 우선 순위가 매우 낮기 때문에 | 기호는 괄호가 필요하므로 OR의 경계를 명시 적으로 지정해야합니다.

이 정규식은 너비가 0 인 표제 (\A\Z 앵커 및 둘러보기 그룹)에 크게 의존합니다. 당신은 정규식을 심각하거나 영구적으로 사용하기 전에 정규식을 항상 이해해야한다. 그렇지 않으면 Start of String and End of String AnchorsLookahead and Lookbehind Zero-Width Assertions을 체크 아웃 할 수있다.

수정 사항은 물론 환영합니다!

+0

나는 이것을 받아 들인 답이라고 생각합니다. 감사! 하지만 복잡한 정규 표현식에 대한 경고를 되풀이하고 싶습니다. 당신이나 다른 누군가가 나중에 코드를 읽는다면 잘 문서화하십시오. 또한 [a-zA-Z0-9 \/\. #?/%]는 [a-zA-Z0-9 /.#?%]로 변경할 수 있습니다 - 당신은 (일반적으로) 탈출 할 필요가 없습니다 문자 그룹 내의 기호. 또한 요구 사항에 따라 http : // 대신 https? : //를 시도하고 다른 프로토콜도 시도 할 수 있습니다. superjadex12 제안대로 http://www.regular-expressions.info/을 확인하는 것을 잊지 마십시오. – WCWedin

7

정규 표현식과 일치하는 모든 항목을 검색하여 빈 문자열 (예 : in Perl s/(http:\/\/)([a-zA-Z0-9\/\.])*//g

이렇게하면 정규식과 일치하는 부분 문자열을 제외한 모든 원본 텍스트가 제공됩니다.

+0

따라서 모든 일치 항목을 바꾼 후에 테스트 된 문자열의 길이가 0이 아니면 반전 된 정규식이 true입니다. 그게 바로 제가 필요로하는 논리입니다. 거꾸로 된 정규식을 만드는 것이 아닙니다. 덕분에 dmcer :) – Exter

1

질문을 올바르게 이해하면 표현식을 검색/바꾸기 ... 와일드 카드로 사용한 다음 처음 부분과 마지막 부분을 대체 할 수 있습니다. 당신은 []에 대해 일치 될 괄호 안에 배치 무엇이든 을 : 당신이 의도 한대로이 정확히 작동하지만 도움이 될 경우

s/^(.*)(your regex here)(.*)$/$1$3/ 
+1

그 중 하나만 일치를 삭제합니다 : 마지막 하나. 매우 비효율적입니다. –

0

메신저 확실하지 않다. 브라켓 (예 : [^ a-zA-Z0-9 /.])에 ^을 넣으면 ( 제외)의 모든 내용이 대괄호 안에 들어 있습니다. 어떤 이유로 당신이 정규식 전용 솔루션이 필요하면

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