2013-05-04 2 views
0

나는 자바에 대해 약간 익숙하다. 그렇기 때문에 내가해야할 일을하고 있는지 잘 모르겠다. 나는 Java 목적을 배우기위한 것이고 명령 행 사용을 위해 생각되는 프로그램을 개발 중이다. 기능 중 하나는 대체 검색의 일종이어야합니다.RegExp에서 사용할 자바 이스케이프 문자열

명령 줄에서이 같은 프로그램 시작 :

java -jar pro.jar -s ${ftp://www.stuff.com} -r foo 

의미 : 정확한 문자열 ${ftp://www.stuff.com}에 대한 검색 및 foo로 대체합니다. 나는 정규 표현식으로 검색 할, 그래서 검색 문자열의 이스케이프 문자 ($, (, {,}, \, ...) 탈출해야

${ftp://www.stuff.com} --> \$\{ftp:\/\/www\.stuff\.com\} 

그러므로 내가 그 기능을 썼다.

모두 모두
private static Pattern getSearchPattern() 
{ 
    String searchArg = cli.getOptionValue("s").trim(); 
    StringBuffer escapedSearch = new StringBuffer(); 
    Pattern metas = Pattern.compile("([\\.\\?\\*\\{\\}\\[\\]\\(\\)\\^\\$\\+\\|\\\\])"); 
    Matcher metaMatcher = metas.matcher(searchArg); 

    while(metaMatcher.find()) 
    { 
     metaMatcher.appendReplacement(escapedSearch, "\\\\\\\\$0"); 
    } 
    metaMatcher.appendTail(escapedSearch); 

    return Pattern.compile(escapedSearch.toString()); 
} 

이 작업을 수행하지만, 너무 많은 백 슬래시가 있습니다.이 모든 metachrackters을 탈출합니까?

+0

당신에게 그 가능성이 있는지는 모르겠지만 어쩌면 당신은 패턴을 받아들이고 그것을 항상 마지막으로 제공하는 단 하나의 논쟁이 있는지 확인할 수 있습니다. 커맨드 라인의 나머지 부분은 항상 당신의 논쟁이며, 정확하게이 작업을 위해 설계된'Pattern.quote'에 대해 – radai

답변

5
당신이 그들을 사용하는 것보다 훨씬 더 나은 뭔가를 할 수

. 당신이 사용할 수있는»강력한«솔루션?인가 a PatternQuote.

Pattern metas = Pattern.quote("no escaped regex chars in here"); 

\\을 제거하는 다른 방법 중 하나는 문자 클래스 []을 사용하는 것입니다. 따라서 \\. 대신 [.]을 입력하면 결과가 동일 해지며 가독성이 높아집니다.

+1

+1을 회피하는 것이 적습니다. '$ 1 '이 패턴의 캡쳐 그룹에 대한 역 참조로 취급되는 대신 문자 그대로 취급되기를 원하면 교체 문자열에서 사용할 수있는'Matcher.quoteReplacement'도 있습니다. –

+0

고마워요! 예상대로 작동합니다! 좋은! – philipp

관련 문제