2017-12-04 14 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に格納され、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()と同じです。

しかし、file.textは実際にはStringであるため、file.textと同じです。

そして、あなたはそれにプレースホルダよりも多くを持っているので、あなたはGStringはすでにreadLines()方法、GStringが必要となる場合でも、最初の.toString()を使用するので、不要を持って、GStringを必要とする場合でも。

関連する問題