2012-06-14 7 views
0

건초 더미에 맞는 이유 : 내가 사용이 패턴은 첫 번째와 마지막

<h2 >a&nbsp; &middot;&nbsp;&middot;&nbsp;&middot; 
</h2> 
<div class="indent"> 
aaaa 
</div> 
<h2 >b&nbsp; &middot;&nbsp;&middot;&nbsp;&middot; 
</h2> 
<div class="indent"> 
bbbb 
</div> 

패턴 :

#<h2[^>]*>(a|b)(?!</h2>)[\s\S]*</h2><div class="indent">((?!</div>)[\s\S]+)</div># 

이 패턴은 첫 번째 H2 내용 (예 : a&nbsp; &middot;&nbsp;&middot;&nbsp;&middot;를) 마지막의 내용과 일치 div (예 : bbbb)

하지만 h2와 div의 모든 콘텐츠와 일치하여 일대일지도를 만들 수 있습니다 (예 : a&nbsp; &middot;&nbsp;&middot;&nbsp;&middot; =>). 210, b&nbsp; &middot;&nbsp;&middot;&nbsp;&middot; =>bbbb) 어떻게해야합니까?

+0

c.c 정규식은 HTML을 구문 분석하는 데 사용해서는 안됩니다. – Daedalus

+0

나는 그것을 분석하려고하지 않고있다. 나는 거미를 만들고있다. 내가 만드는 데 사용해야 할 것은 무엇인가? – LotusH

+0

모든 ''다음에 개행 문자가 있기 때문에 일치하지 않아야합니다. 아니면 '건초 더미'를 변경 했습니까? – Wrikken

답변

1

[\s\S]*[\s\S]+은 가능한 한 많은 문자와 일치한다는 의미입니다. 숫자를 [\s\S]*?[\s\S]+?으로 변경하십시오. 현재 정규식

, 당신이 캡처 그룹으로 [\s\S]*를 넣어 것 인 경우에 당신이 다음과 일치하는 것을 볼 것입니다 :

&nbsp; &middot;&nbsp;&middot;&nbsp;&middot; 
</h2> 
<div class="indent"> 
aaaa 
</div> 
<h2 >b&nbsp; &middot;&nbsp;&middot;&nbsp;&middot; 

끝에 ? 추가 그래서 대신 매칭이 게으른한다 가능한 한 적은 수의 문자로 일치하므로 가능한 한 처음으로 </h2>에서 멈 춥니 다. 동일한 이유가 정규 표현식의 [\s\S]+에 적용됩니다.

그것은 또한 당신의 정규식의 중간에 </h2><div...을 가지고 있기 때문에 샘플 문자열에 실패 할 경우 다음과 같이 보이지만, 샘플 텍스트에 닫는 </h2><div> 사이에 줄 바꿈이 항상있다, 당신은 아마이 부분을 변경해야합니다 </h2>\s*<div.... 최종 결과 :

#<h2[^>]*>(a|b)(?!</h2>)[\s\S]*?</h2>\s*<div class="indent">((?!</div>)[\s\S]+?)</div># 

But don't parse HTML with regex!

+0

작동합니다! 고맙습니다. 생각 나게 해 주셔서 감사합니다.하지만 '구문 분석'의 범위에서 크롤링 중입니까? 정규식을 사용하여 크롤러를 만들지 않으면 무엇을 사용해야합니까? – LotusH

+0

@ Wasabi 다른 사람이 이미 작성하고 올바르게 작성한 HTML 파서를 사용해야합니다. –

관련 문제