2017-07-14 6 views
1

私はログファイルを読み込み、ファイルに含まれる特定のデータを抽出しています。私は、ログファイルの各行の時間を抽出することができます。各IDの反復サブストリングに基づいてID文字列を抽出するJava Regex

今度はid "ieatrcxb4498-1"を抽出したいと思います。 idのすべてはサブ文字列ieatrcxbで始まり、それを基にして完全な文字列を返すようにしました。

私は他の投稿から多くの異なる提案を試みました。しかし、私は次のパターンで、成功していない:私もiから始まり、1に仕上げ文字列に、ベースの完全なIDを抽出しようとしてい

(?i)\\b("ieatrcxb"(?:.+?)?)\\b 
(?i)\\b\\w*"ieatrcxb"\\w*\\b" 
^.*ieatrcxb.*$ 

。彼らがすべてそうするように。ログファイルの

ライン

150: 2017-06-14 18:02:21 INFO monitorinfo   :  Info: Lock VCS on node "ieatrcxb4498-1" 

コード

Scanner s = new Scanner(new FileReader(new File("lock-unlock.txt"))); 
    //Record currentRecord = null; 
    ArrayList<Record> list = new ArrayList<>(); 

    while (s.hasNextLine()) { 
     String line = s.nextLine(); 

     Record newRec = new Record(); 
     // newRec.time = 
     newRec.time = regexChecker("([0-1]?\\d|2[0-3]):([0-5]?\\d):([0-5]?\\d)", line); 

     newRec.ID = regexChecker("^.*ieatrcxb.*$", line); 

     list.add(newRec); 

    } 


public static String regexChecker(String regEx, String str2Check) { 

    Pattern checkRegex = Pattern.compile(regEx); 
    Matcher regexMatcher = checkRegex.matcher(str2Check); 
    String regMat = ""; 
    while(regexMatcher.find()){ 
     if(regexMatcher.group().length() !=0) 
      regMat = regexMatcher.group(); 
     } 
     //System.out.println("Inside the "+ regexMatcher.group().trim()); 
    } 

    return regMat; 
} 

私は私のためにこれを行います単純なパターンを必要としています。

+0

"ログファイルとファイルに含まれている特定のデータを抽出する" - どのような種類のデータ、どのようなログファイルですか?例を投稿してください。 – user3734782

+0

@ user3734782150:2017-06-14 18:02:21 INFO monitorinfo:情報:ノード "ieatrcxb4498-1"でVCSをロックします。これはログファイルのデータのサンプルです。 –

+0

だから、IDを含む行全体を抽出したいですか? – user3734782

答えて

1

IDは常に「ieatrcxb」の後に4桁、その後には-、その後に1桁の形式を持ちますか?

そのような場合、あなたが行うことができます:

regexChecker("ieatrcxb\\d{4}-\\d", line); 

は正確に4桁の数字(\\d)に一致{4}数量詞を、注意してください。最後の桁が常に1の場合は、"ieatrcxb\\d{4}-1"を使用することもできます。

数字の桁数が異なる場合は"ieatrcxb\\d+-\\d+"を使用できます。+は「1以上」を意味します。

また、量子を使用して、最小値と最大発生数を使用することもできます。例:"ieatrcxb\\d{4,6}-\\d" - {4,6}は「最小4と最大6回の出現」を意味します(これは単なる例ですが、あなたのケースであるかどうかわかりません))。 IDが持つことができる桁数を正確に知っている場合に便利です。

上記のすべてがあなたのケースでは、ieatrcxb4498-1を返します。どちらを使用するかは、入力の仕方によって異なります。


あなたはieatrcxb一部(4498-1)なしで数字だけをしたい場合は、lookbehind regexを使用することができます。

regexChecker("(?<=ieatrcxb)\\d{4,6}-\\d", line); 

これはieatrcxbはこれだけ4498-1を返し、試合の一部ではないとなります。

あなたも-1だけ4498したくない場合は、先読みでこれを組み合わせることができます。

regexChecker("(?<=ieatrcxb)\\d{4,6}(?=-\\d)", line) 

これは単に4498を返します。

+1

これは完璧に感謝しました。 –

1
public static void main(String[] args) { 
    String line = "150: 2017-06-14 18:02:21 INFO monitorinfo   :  Info: Lock VCS on node \"ieatrcxb4498-1\""; 
    String regex ="ieatrcxb.*1"; 
    Pattern p = Pattern.compile(regex); 
    Matcher m = p.matcher(line); 
    while(m.find()){ 
     System.out.println(m.group()); 
    } 
} 

またはIDのは、すべて引用されている場合:あなたは非常に困難な方法でそれをやろうとしている

String id = line.substring(line.indexOf("\""), line.lastIndexOf("\"")+1); 
System.out.println(id); 
0

を。 lock-unlock.txtファイルの各行は、あなたが投稿スニペットのように同じである場合は、次のことが可能です。

File logFile = new File("lock-unlock.txt"); 

List<String> lines = Files.readAllLines(logFile.toPath()); 

List<Integer> ids = lines.stream() 
       .filter(line -> line.contains("ieatrcxb")) 
       .map(line -> line.split("\"")[1]) //"ieatrcxb4498-1" 
       .map(line -> line.replaceAll("\\D+","")) //"44981" 
       .map(Integer::parseInt) // 44981 
       .collect(Collectors.toList()); 

あなただけのID番号を探してされていない場合は、単に、第二/コメントを削除し、第三.map()メソッド呼び出しIntegerではなくList of Stringsになります。

関連する問題