2012-05-09 15 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のJava正規表現を使用しています。そうでなければパターンマッチングは起こらない。誰でも解決策を提案できますか?

たとえば、私の検索文字列は、 "これは" であると
入力ファイルが含まれている "こと" である文字列を置き換えます。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し、あなたの最終的な答えとして1つを選択する必要があります。 –

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

ありがとう。私の場合、lookingAtは間違った使い方でした。 findはうまく動作します。 – user1384205

+0

'String.replaceAll()'は検索文字列の正規表現をコンパイルすることに注意してください。これを必要としない場合は 'String.replace()'を使います。 – alexg

0

メモリに問題がない場合は、ファイル全体を文字列として読み取り、文字列APIでpublic String replaceAll(String regex, String replacement)を使用できます。

関連する問題