2017-12-04 9 views
0

아래 코드를 찾으십시오. 파일 및 디렉터리를 반복하고 정규식에 대한 모든 일치 항목을 인쇄하려고합니다. (&)(.+?\b) 그러나이 방법은 작동하지 않습니다 (빈 문자열을 반환 함). 나는 어디로 잘못 갔는가?그루비가 작동하지 않는 정규식

import groovy.io.FileType 

class FileExample { 
    static void main(String[] args) { 

     def list = [] 

     def dir = new File("*path to dir*") 
     dir.eachFileRecurse (FileType.FILES) { file -> 
      list << file.name; 
      def s= "${file.text}"; 
      def w = s.toString(); 
      w.readLines().grep(~/(&)(.+?\b)/) 
     } 
    } 
} 
+0

이 결과로 무엇을 기대합니까? 정규식과 일치하는 줄이 들어있는 파일을 원한다고 가정할까요? 'each '는 항상 부작용을위한 것이고 입력을 최대한 반환합니다. – cfrick

+0

모든 정규식 일치 항목이 나열되기를 원하지만, 실제로 일치 항목의 위치는 신경 쓰지 않습니다. – user9053278

답변

0

는 그것을 냈 :

지금
import groovy.io.FileType 
class FileExample { 
    static void main(String[] args) { 

     def list = [] 
     def dir = new File("/path/to/directory/containingfiles") 
     def p = [] 
     dir.eachFileRecurse (FileType.FILES) { 
      file -> list << file.name 
      def s = file.text 
      def findtp = (s =~ /(&)(.+?\b)/) 
      findtp.each { 
       p.push(it[2]) 
       // As I'm only interested in the second matched group 
      } 
     } 
     p.each { 
      println it 
      } 
     } 
    } 

모든 검색된 문자열 배열 (P)에 저장하고 인쇄 할 수/병렬 [0] 등으로 다른 곳에서 사용

0

w.readLines().grep(~/(&)(.+?\b)/) 어떤 출력도하지 않으면 반환하는 값과 일치하는 줄을 제공하므로 println w.readLines().grep(~/(&)(.+?\b)/) 또는 w.readLines().grep(~/(&)(.+?\b)/).each { println it }으로 변경하면 일치하는 줄이 stdout에 인쇄됩니다.

btw.

def s= "${file.text}"; 
def w = s.toString(); 
w.readLines() 

은 단지 시간 낭비 일뿐입니다. 정확히 file.text.readLines()과 같습니다.

"${file.text}" 평가에 자리를 대체하는 GString,하지만 당신은 file.text 자리하지만 아무것도 없기 때문에,이 file.text as String 또는 file.text.toString()과 동일합니다.

그러나 실제로는 이 String이므로 이미 file.text과 동일합니다. 당신이 그것의 자리보다 더를 가지고 있기 때문에 당신이 GString을해야하는 경우에도

는 그리고, GString 이미 readLines() 방법, 그래서 GString이 필요하다하더라도, .toString() 먼저 사용에 대한 필요성이있다.