2016-10-29 7 views
1

제목에서 알 수 있듯이 정규식을 사용하여 주어진 파일의 모든 일치 항목을 계산하는 Java 코드를 작성했습니다. 파일 내의 일치. 새 줄에서 각 문자열을 구분하면 완벽하게 작동합니다.Java 정규식은 주어진 파일에서 모든 일치 항목을 계산하지 않습니다.

: 나는에서 읽은 파일은 여기에

String regex = "(00966|\\+966)\\d{9}"; 
int countNumbers = countOccurrences(fileContainsNumbers, regex); 

것 :

private static int countOccurrences(String path, String regex) { 
    Pattern pattern = Pattern.compile(regex); 
    Matcher matcher; 
    int count = 0; 
    try { 
     BufferedReader br = new BufferedReader(new FileReader(path)); 
     String line; 
     while ((line = br.readLine()) != null) { 
      matcher = pattern.matcher(line); 
      if (matcher.find()) 
       count++; 
     } 
     br.close(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

    return count; 
} 

여기에 그 방법을 사용하여 코드입니다 : 이것은 계산하는 메소드가

: 여기에 내 코드입니다 Lorem Ipsum은 단순한 더미 +966111111111 인쇄물이며 조판 업계 + 966222222222 Lorem Ipsum has 알 수없는 프린터가 유형의 조리실을 취하고 형식 표본을 만들기 위해 +966444444444 +96645789541063을 스크램블링 한 1500 년대 이래로 업계의 표준 더미 텍스트 +966333333333이되었습니다. +966569874514 그것은 5 세기뿐만 아니라 전자 도약으로 도약했습니다. 조판, 남은 +966569874514는 본질적으로 변하지 않았습니다. Lorem Ipsum 구절이 포함 된 Letraset 시트가 출시되었으며, 최근에는 Lorem Ipsum의 버전을 포함하여 Aldus PageMaker +966555555555와 같은 게시 소프트웨어 게시 소프트웨어가 출시되어 1960 년대에 이 대중화되었습니다.

답변

1

잘못된 방법으로 find() 메서드를 사용하고 있습니다. 대신

if (matcher.find()) 
    count++; 

당신은 당신이 볼

while (matcher.find()) 
    count++; 

, 당신은 다수에게 줄에 경기를 가질 수해야한다. 따라서이 메소드는 복수이 일치하는 행에 대해 여러 번 true를 반환 할 수 있습니다. 하지만 첫 번째 사실 이후 계산을 멈추십시오!

즉, 각 행의 모든 ​​경기를 계산하려면 행의 첫 경기 이후에 계산을 멈추지 마십시오!

+0

아, 내가 왜 처음 라인 일치 당에서 카운팅을 멈추는 지 알 것 같습니다. 그러나이 코드는 전체 파일을 반복 할 것인가? 또는 파일 루프 내에서 다른 루프를 사용해야합니까? – Chance

+1

왜 그냥 사용해 보지 않으시겠습니까? 나는 그것이 효과가 있어야한다고 생각한다. 보시다시피 - 이미 그 파일의 모든 줄을 반복하고 있습니다. 그런 다음 일치하는 PER 행을 계산하기 위해 정규 표현식을 반복해야합니다. 이미 제안 된대로 IF를 WHILE로 바꾸면 필요한 내부 루프가 추가됩니다! – GhostCat

+0

완벽하게 작동했습니다. 대단히 감사합니다. 가능한 경우 "중첩 루프"대신 "하나의 루프"를 사용하는 더 좋은 방법을 찾으려고 노력할 것입니다. 답변으로 표시 : – Chance