2013-07-12 2 views
0

최신 업데이트 : 이것은 표현 자체가 아니라 정규 표현식에 문제가있는 것 같습니다. 필자는 그것을 조금 더 테스트하고 입력 문자열에 Pattern/Matcher를 사용하면 문제가 발생합니다. 메타 문자가있는 입력 문자열은 정규 표현식을 통해 건너 뛸 수 있습니다. 방금 사용한 .replaceAll을 같은 표현식으로 사용하면 괜찮습니다. Pattern.quote를 입력 문자열에 사용하려고했지만 아무 것도 변경하지 않았습니다. 그래서 나는 아직도 붙어있다. 입력 문자열에 메타 문자가있는 경우 정규식이 일치하지 않는 이유는 무엇입니까? 그리고 거기에 matcher에 관해서 입력 문자열이 메타 문자를 무시하도록 만드는 방법이 있습니까? (점)은 문자열에서 괄호를 찾지 못합니까?


나는 닫는 태그의 태그의 시작에서 모든 HTML 링크를 꺼내 큰 문자열에 정규식을하려고하고있다. 나는이 표현을 생각해 냈다 :

<a.*?</a> 

어느 것이 꽤 잘하는가? 거의 모든 것을 얻을 수 있습니다. 내 문제는 문자열 안에 괄호가있는 경우입니다.

<a href="blahblah">myproblem()</a> 

정규식은이 링크를 완전히 건너 뜁니다. 나는. *이라고 생각했다. 처음 a 뒤에 오는 공간부터 닫는 태그의 열린 대괄호까지 모든 것을 가져 오지만 괄호가있는 경우에는 그렇지 않습니다.

무엇이 여기에 있습니까?

설명을위한 EDIT :

자바를 사용하고 있습니다. 여기에 내 프로젝트에 추가하기 전에 이것을 테스트하기 위해 내가하고있는 일이있다. 내가 이걸 실행할 때 실패하지만, 시험에서()을 꺼내면 통과한다. 와() 나는 그것이 심지어 목록에 추가하지 않을 확신 해요 :

String tryConvert = doclet.htmlToWiki("<a href=\"#test.method\">test()</a>"); 
assertThat(tryConvert, is("[test()|test#method]")); 

그리고 htmlToWiki 코드 : 사용중인 자바 스크립트를 보지 않고

ArrayList<String> links = new ArrayList<String>(); 
    Pattern linkPattern = Pattern.compile("<a.*?</a>", Pattern.DOTALL); 
    Matcher matcher = linkPattern.matcher(html); 
    while (matcher.find()) 
    { 
     links.add(matcher.group()); 
    } 

    for (String link : links) 
    { 
     String original = link; 
     String alias = link.replaceAll("<a.*?>", ""); 
     alias = alias.replaceAll("</a>", ""); 
     link = link.replaceAll("\">.*?</a>", "]"); 
     link = link.replaceAll("<a.*#", "["); 
     link = link.replaceAll("\\.", "#"); 
     link = link.replace("[", "[" + alias + "|"); 
     html = html.replaceAll(original, link); 
    } 
+0

는이'?'정확히 무엇을 생각됩니다 실현하지 나로부터 오해의 소지가 된 것 같아요?아,이 표현식은 태그 이름이 "a"로 시작하는 요소 (예 : , , )를 선택합니다. 또한 [this] (http://stackoverflow.com/a/1732454/1016716). –

+0

정규식을 처음 사용하니? 이전 식의 0 또는 1로 설명되었습니다. 나는 그것을 보았 기 때문에 그냥 놓았습니다. *? 일종의 '모두 잡아'. 나는 다른 태그들에 대해 정말로 생각하지 않았습니다. 감사합니다. 그러나 지금은()가 왜 엉망이되는지 이해하려고 노력하고 있습니다. – Pewsplosions

답변

0

많은 테스트 후 등은 내 패턴과 정규 후 모든 probem 아니라는 것을 알아 냈어. 내 코드의 문제는 마지막 replaceAll 메소드에서 원래의 문자는 리터럴이 아닌 다른 REGEX 패턴이라는 것입니다. 그래서 메타 문자를 찾고 예상했던대로하지 않았습니다.

마지막 replaceAll을 수행 할 때 비슷한 것을 시도하는 경우 원래 변수를 Pattern.quote()로 둘러 쌉니다.

Pattern.quote(original) 

이렇게하면 원본을 본질적으로 문자 그대로 취급합니다. 도움말 모두

덕분에, 나는 나의 질문은 그런 작은 일 (즉, 항상하지 않은 경우!?)

2

가 어렵다 정확히 무엇이 잘못되었는지 말해주십시오. 아마도 너무 많은 이스케이프 문자가 있습니다. (어쨌든 여기서는 실제로 필요하지 않습니다.) 이것은 나를 위해 작동 : 또는

var input = 'foo <a href="blahblah">myproblem()</a> bar'; 
var match = input.match(/<a.*?<\/a>/); 
alert(match[0]); // <a href="blahblah">myproblem()</a> 

:

var input = 'foo <a href="blahblah">myproblem()</a> bar'; 
var match = RegExp('<a.*?</a>').exec(input); 
alert(match[0]); // <a href="blahblah">myproblem()</a> 
+0

빠른 답변을 보내 주셔서 감사합니다. 나는 원래 게시물에 더 많은 세부 사항을 추가 할 것입니다, 어쩌면 몇 가지 명확히하는 데 도움이됩니다. – Pewsplosions

+0

< and >의 이스케이프 문자를 제거했는데 모든 것이 여전히 같은 방식으로 작동합니다. (왜 내가 왜 필요하다고 생각했는지 확신 할 수 없습니다.) 그래서 내 표현이 작동해야합니다 ... 왜 그런지 알지 못합니다. 그것은 http://www.regexplanet.com/advanced/java/index.html에서도 작동했습니다 .. – Pewsplosions

+0

@ user2395495 그것이 일치하지 않는다는 것이 긍정적입니까? 오류가'htmlToWiki'의 다른 곳에있을 수 있습니까? –

관련 문제