2012-05-09 6 views
0

주어진 문자열에 대해 파일을 검색하고 다른 문자열로 바꾸는 일반적인 방법을 쓰려고합니다. 나는이 논리는 한 검색 문자열이 파일의 각 행의 시작 부분에서와 같이 작동JAVA REGEX를 사용하여 지정된 문자열을 검색하십시오.

에서 같은

patternMatcher = Pattern.compile(searchString); 
while ((line = readLine()) != null) { 
    Matcher regexMatcher = patternMatcher.matcher(line); 
     if (regexMatcher.lookingAt()) { 
      line = regexMatcher.replaceAll(replaceString); 

..so을위한 자바 정규식을 사용하고 있습니다. 그렇지 않으면 패턴 일치가 발생하지 않습니다. 누구든지 해결책을 제안 할 수 있습니까?

예 : 내 검색 문자열은 "이것은"이고
입력 파일에 포함 된 "그"입니다 문자열 바꾸기 : This is not This funny
출력 : That is not That funny

그러나
입력 파일이 포함되어 007 This is not This funny
출력 : 007 This is not This funny

답변

1

... 아니겠습니까?

patternMatcher = Pattern.compile(searchString); 
while ((line = readLine()) != null) { 
    Matcher regexMatcher = patternMatcher.matcher(line); 
     while (regexMatcher.find()) { 
      line = regexMatcher.replaceAll(replaceString); 

"+? (이)"을 quatifier가 결과에 영향을 미칠 수 있음을 고려 검색 문자열이어야 perhapaps "(이) +"또는.

+0

감사합니다. find 메소드가 작동합니다. 내 바보 야! – user1384205

+0

@ user1384205 당신에게 맞는 대답을 upvote하고 최종 답을 하나 선택하십시오. –

0

패턴이 아닌 상수 문자열을 검색하는 경우 정규식을 사용하지 않아야하는 여러 가지 이유가 있습니다.

  • 사용자는 정규식 문법에서 특별한 의미가있는 문자를 입력 할 수 있습니다.
  • 정규 표현식은 부분 문자열 검색에 비해 느립니다.
  • 사용자가 의도 한 것보다 더 많은 기능 (정규식 일치 사용)을 허용하고 싶지는 않습니다.

대신 String.indexOf 및/또는 String.replace을 사용하십시오.

while ((line = readLine()) != null) 
    if (line.indexOf(searchString) != -1) 
     line.replace(searchString, replaceString); 
+0

때때로 작동하는 파일은 여러 MB로 실행되며 응용 프로그램은 매우 집중적입니다. 문자열 조작에 대해 정규식을 사용하기로 결정한 이유는 줄 단위로 읽지 않고 스트림을 읽었을 때와 동일했습니다. 임마라면 저를 바로 잡으십시오. – user1384205

+0

좋은 IO 성능을 원한다면'java.nio' (새로운 I/O)를 보라. NIO가있는 행을 읽으려면 NIO 스트림에서'BufferedReader.readLine()'을 사용하십시오. 이 모든 것은 정규 표현식을 사용할지 여부를 결정할 때와 상관이 없습니다. – alexg

0

저는 Java에 익숙하지 않지만 문서에 따라 lookingAt은 문자열의 시작 부분을 봅니다. 나는 성냥을 찾는 것을 건너 뛰고 일치가 있는지 여부와 관계없이 맹목적으로 replaceAll을 달린다. 일치하는 항목이 없으면 아무 것도 대체하지 않습니다.

교체를 시도하기 전에 어떤 이유로 일치 항목을 찾아야하는 경우 올바른 기능은 find입니다. http://docs.oracle.com/javase/1.4.2/docs/api/java/util/regex/Matcher.html

+0

감사합니다. 내 사건 에선 잘못된 사용법 이었어. find는 잘 작동합니다. – user1384205

+0

'String.replaceAll()'은 검색 문자열에서 정규 표현식을 컴파일합니다. 이것을 필요로하지 않는다면'String.replace()'를 사용하십시오. – alexg

0

메모리가 문제가되지 않으면 전체 파일을 String으로 읽고 String API에서 public String replaceAll(String regex, String replacement)을 사용할 수 있습니다.

관련 문제