2009-04-30 5 views
1

정규 표현식에 문제가 있습니다 : <a.*href=[\"'](.*?)[\"'].*>(.*?)</a>. 여러분은 아마도 알 수 있듯이 HTML 문자열에서 모든 링크를 가져와 그룹 2의 링크 텍스트와 그룹 1의 링크 대상을 반환한다고 가정합니다.하지만 문제가 있습니다. 내가 (모든 플래그에 함께 http://www.regextester.com/ 사용) 자바 스크립트를하려고하면, 그것을 잘 작동하지만, 자바,이 같은 :자바 대 자바 정규 표현식 문제

Pattern myPattern = Pattern.compile("<a.*href=[\"'](.*?)[\"'].*>(.*?)</a>", Pattern.CASE_INSENSITIVE); 
Matcher match = myPattern.matcher(htmlData); 
while(match.find()) { 
String linkText = match.group(2); 
String linkTarget = match.group(1); 
} 

내가 기대하는 모든 일치하지 않습니다. regex 테스터를 사용하면 더 많은 것을 얻을 수 있으며 예상대로 작동하지만 Java 버전에서는 페이지 당 1-2 개의 링크 만 가져옵니다.
죄송 합니다만 이것이 정규식에 익숙하지 않은 경우 죄송합니다.
감사합니다,
이삭 월러

편집 : 나는 내 정규식에 문제가있을 것 같아요. 이 아파치 같이 IndexOf 페이지에서, 참조 :

<tr><td valign="top"><img src="/icons/sound2.gif" alt="[SND]"></td><td><a href="Bryan%20Adams%20-%20Here%20I%20Am.mp3">Bryan Adams - Here I Am.mp3</a></td><td align="right">27-Aug-2008 11:48 </td><td align="right">170K</td></tr> 
<tr><td valign="top"><img src="/icons/sound2.gif" alt="[SND]"></td><td><a href="Cars%20-%20Drive.mp3">Cars - Drive.mp3</a></td><td align="right">26-Aug-2008 19:04 </td><td align="right">149K</td></tr> 
<tr><td valign="top"><img src="/icons/sound2.gif" alt="[SND]"></td><td><a href="Cock%20Robin%20-%20When%20Your%20Heart%20Is%20Weak.mp3">Cock Robin - When Your Heart Is Weak.mp3</a></td><td align="right">26-Aug-2008 19:04 </td><td align="right">124K</td></tr> 
<tr><td valign="top"><img src="/icons/sound2.gif" alt="[SND]"></td><td><a href="Colbie%20Caillat%20-%20Bubbly.mp3">Colbie Caillat - Bubbly.mp3</a></td><td align="right">27-Aug-2008 11:49 </td><td align="right">215K</td></tr> 

<tr><td valign="top"><img src="/icons/sound2.gif" alt="[SND]"></td><td><a href="Colbie%20Caillat%20-%20The%20Little%20Things.mp3">Colbie Caillat - The Little Things.mp3</a></td><td align="right">27-Aug-2008 11:49 </td><td align="right">176K</td></tr> 
<tr><td valign="top"><img src="/icons/sound2.gif" alt="[SND]"></td><td><a href="Coldplay%20-%20Violet%20Hill.mp3">Coldplay - Violet Hill.mp3</a></td><td align="right">27-Aug-2008 11:49 </td><td align="right">136K</td></tr> 
<tr><td valign="top"><img src="/icons/sound2.gif" alt="[SND]"></td><td><a href="Corrs%20-%20Radio.mp3">Corrs - Radio.mp3</a></td><td align="right">26-Aug-2008 19:04 </td><td align="right">112K</td></tr> 
<tr><td valign="top"><img src="/icons/sound2.gif" alt="[SND]"></td><td><a href="Corrs%20-%20What%20Can%20I%20Do.mp3">Corrs - What Can I Do.mp3</a></td><td align="right">26-Aug-2008 19:04 </td><td align="right">146K</td></tr> 
<tr><td valign="top"><img src="/icons/sound2.gif" alt="[SND]"></td><td><a href="Counting%20Crows%20-%20Big%20Yellow%20Taxi.mp3">Counting Crows - Big Yellow Taxi.mp3</a></td><td align="right">26-Aug-2008 19:04 </td><td align="right">135K</td></tr> 

<tr><td valign="top"><img src="/icons/sound2.gif" alt="[SND]"></td><td><a href="Curtis%20Stigers%20-%20I%20Wonder%20Why.mp3">Curtis Stigers - I Wonder Why.mp3</a></td><td align="right">26-Aug-2008 19:03 </td><td align="right">213K</td></tr> 
<tr><td valign="top"><img src="/icons/sound2.gif" alt="[SND]"></td><td><a href="Cyndi%20Lauper%20-%20Time%20After%20Time.mp3">Cyndi Lauper - Time After Time.mp3</a></td><td align="right">26-Aug-2008 19:03 </td><td align="right">193K</td></tr> 
<tr><td valign="top"><img src="/icons/sound2.gif" alt="[SND]"></td><td><a href="David%20Bowie%20-%20Absolute%20Beginners.mp3">David Bowie - Absolute Beginners.mp3</a></td><td align="right">26-Aug-2008 19:04 </td><td align="right">155K</td></tr> 
<tr><td valign="top"><img src="/icons/sound2.gif" alt="[SND]"></td><td><a href="Depeche%20Mode%20-%20Enjoy%20The%20Silence.mp3">Depeche Mode - Enjoy The Silence.mp3</a></td><td align="right">26-Aug-2008 19:03 </td><td align="right">230K</td></tr> 
<tr><td valign="top"><img src="/icons/sound2.gif" alt="[SND]"></td><td><a href="Dido%20-%20White%20Flag.mp3">Dido - White Flag.mp3</a></td><td align="right">27-Aug-2008 11:48 </td><td align="right">158K</td></tr> 

내가 가야 :
1 : 브라이언 % 20Adams % 20 % 20Here % 20I % 20Am.mp3
2 : 브라이언 아담스 - 여기에 내가 Am.mp3
등이 더 있습니다. Regex 테스터를 사용하면 원하는 모든 결과를 얻을 수 있습니다. Java에서는 아무 것도 얻지 못합니다.

+0

이것은 Java vs. JavaScript 문제가 아니며 테스터의 결함입니다. 단선 모드 (Java에서 DOTALL 모드)를 지정할 수 없습니다. 그래서 정규 표현식이 "작동"하는 이유입니다. 모든 일치 항목은 텍스트의 개행 문자로 둘러싸여 있으므로 둘 이상의 링크와 일치 할 수 없습니다. –

+0

감사합니다. Alex, 어떻게 해결하겠습니까? –

답변

3

당신은 백 슬래시 문자와 인용 부호를 탈출해야 :

Pattern myPattern = Pattern.compile("<a.*href=[\\\"'](.*?)[\\\"'].*>(.*?)</a>", Pattern.CASE_INSENSITIVE); 

그러나,이 당신의 진짜 문제가되지 않을 수 있습니다. 백 슬래시는 실제로 패턴에 필요하지 않습니다. 이 패턴에는 몇 가지 다른 가능한 문제가 있습니다.

href 속성 앞에 greedy 일치 항목을 사용하고 있습니다. 즉, 줄의 첫 번째 링크 시작 부분과 마지막 줄 링크의 href 속성이 일치합니다. ".*"에서 ".*?"으로 변경하여 성냥을 비 욕심쟁이로 만듭니다. href 속성 다음의 일치 항목에 대해서도 동일하게 적용됩니다. 욕심이 없거나 줄의 마지막 링크와 일치해야합니다.

. 문자는 줄 바꿈 문자와 일치하지 않으므로 링크 코드 나 링크 텍스트에 줄 바꿈이 있으면 링크가 일치하지 않습니다. 어떤 문자와도 일치 시키려면 . 대신 [\W\w]을 사용할 수 있습니다.

그래서, 백 슬래시를 제거 일치가 아닌 욕심 만들고 줄 바꿈 패턴을 만들 것입니다 수 :

Pattern myPattern = Pattern.compile("<a[\\W\\w]*?href=[\"'](.*?)[\"'][\\W\\w]*?>([\\W\\w]*?)</a>", Pattern.CASE_INSENSITIVE); 

편집 :
내가 문자열의 [\W\w] 코드에 백 슬래시 탈출을 잊어 버렸습니다.

+0

2 개 대신 3 개의 슬래시를 사용한다고 생각합니다.하지만 관계없이 작동하지는 않습니다. 죄송합니다. –

+0

Isaac은 DOTALL 수정 자 (다른 모든 수식어와 함께)를 사용 중이므로 점들이 이미 개행과 일치합니다. 그가 그것을 버려 두었다면, 아마도 그가 틀린 것을 눈치 채지 못했을 것이라고 생각해보십시오. 샘플 텍스트의 모든 링크는 최소한 하나의 개행으로 구분됩니다. –

0

Do not 모두 전체 일치/와일드 카드 일치가 일치하지 않아야합니까?

<a.*?href=[\"'](.*?)[\"'].*?>(.*?)</a> 

나는 패턴에 대한 이스케이프 규칙을 알지 못하므로 자바 개발자가 아닙니다.