2012-07-17 4 views
-1

문제 : 문자열의 모든 st를 가져와야합니다. 그렇게하면 메모에 마지막 결과 인 st2 만 추가됩니다. st와 st2 등을 어떻게 얻을 수 있습니까?Delphi : TRegExpr

const 
    pattern = '<h3 class=.*><a class=.*>([a-zA-Z0-9а-яА-Я]+)</a></h3>'; 
var 
    r: TRegExpr; 
    s: string; 
begin 
r:=TRegExpr.Create; 
s:='<h3 class="yt-lockup-ellipsize"><a class="yt-uix-sessionlink yt-uix-tile-link result-item-translation-title"dir="ltr"title="Женщины"data-sessionlink="ei=CO_0s_S3oLECFQQZ3wodxl5sKw%3D%3D"href="/watch?v=E0MzksPjObU">st1</a></h3>'; 
s:=s + '<h3 class="yt-lockup-ellipsize"><a class="yt-uix-sessionlink yt-uix-tile-link result-item-translation-title"dir="ltr"title="Женщины"data-sessionlink="ei=CO_0s_S3oLECFQQZ3wodxl5sKw%3D%3D"href="/watch?v=E0MzksPjObU">st2</a></h3>'; 
r.Expression:=pattern; 
if r.Exec(s) then 
    REPEAT 
    Memo2.Lines.Add(r.Match[1]); 
    UNTIL not r.ExecNext; 

답변

4

어. regexs = bad로 HTML을 파싱하면 이 좋지 않습니다. 아이디어입니다.

어쨌든 정규식은 욕심이 많으므로 "<h3 class=.*><a class=.*>" 부분이 첫 번째 태그에서 두 번째 태그까지 일치합니다. 그 첫 번째 ">"를 통해서만 물건을 중얼 거릴 필요가 있으므로 "<h3 class="[^>]*><a class="[^>]*>([a-zA-Z0-9а-яА-Я]+)</a></h3>"과 같은 것을 시도해보십시오. (예 : ". *"대신 ". +?"와 같은 게으른 한정 기호를 사용할 수도 있지만 제외 된 옵션을 사용하는 것보다 느립니다.)

">"포함 된 따옴표 붙은 속성에서 - 더 많은 일을해야합니다.

  • 편집 : 참고로, 여기에 게으른 정량 버전입니다 : <h3\sclass=.+?><a\sclass=.+?>([a-zA-Z0-9а-яА-Я]+)</a></h3>합니다 ("\ s는"공백 문자 - 훨씬 더 신뢰할 수있는 대부분의 정규식에 파서.).

정말, XML 파서를 통해 실행하는 것이 훨씬 낫습니다.

+0

감사합니다. 왜 나쁜 생각이야? 그리고 좋은 생각 이니? :) – dedoki

+2

일반적으로 HTML은 정규 언어가 아니므로 regexs는 HTML을 작성할 수있는 모든 방법을 포착 할 수 없습니다 (닫는 태그가 없으면 XML 파싱에도 실패합니다). 나는 최근의 경험을 통해 이야기한다 : 나의 정규식 기반 HTML 파서는 주석 처리 된 HTML을 건너 뛰지 않았다. 우둔한. C.f., 재미있는 시도를 위해 http://www.codinghorror.com/blog/2009/11/parsing-html-the-cthulhu-way.html. 또한 파서를 완전히 잠그는 정규식 기반 솔루션에 HTML을 공급할 수도 있습니다. 잘 정의 된 도메인을 가지고 있다면 실제로는 괜찮을 것입니다. 신뢰할 수없는 입력에주의하십시오. –

+2

좋은 아이디어가 나오면 ... 가장 간단한 HTML 구문 분석 외에는 아무것도 할 필요가 없다면 Python for Delphi를 사용하여 BeautifulSoup을 호출 할 수 있습니다. 이것은 BeautifulSoup을 HTML 파서의 시금석에 불과합니다. –

관련 문제