0

ファイルで特定の文字列を検索し、それを別の文字列に置き換えるジェネリックメソッドを作成しようとしています。私は同じためにJava正規表現を使用しています

patternMatcher = Pattern.compile(searchString);
while ((line = readLine()) != null) {
    Matcher regexMatcher = patternMatcher.matcher(line);
       if (regexMatcher.lookingAt()) {
          line = regexMatcher.replaceAll(replaceString); 

..すぐ

このロジックは、検索文字列がファイルの各行の先頭にある限り機能します。そうしないと、パターンマッチングは発生しません。誰かが解決策を提案できますか?

たとえば。私の検索文字列は「This」で、置換文字列は「That」です。
入力ファイルには次のものが含まれます。This is not This funny
出力:That is not That funny

ただし、
入力ファイルに次のものが含まれている場合:007 This is not This funny
出力:007 This is not This funny

4

4 に答える 4

1

そうじゃないの…?

patternMatcher = Pattern.compile(searchString);
while ((line = readLine()) != null) {
    Matcher regexMatcher = patternMatcher.matcher(line);
       while (regexMatcher.find()) {
          line = regexMatcher.replaceAll(replaceString); 

四分円が結果に影響を与える可能性があることを考慮に入れてください。おそらく、検索文字列は「(this)+」または「(this)+?」である必要があります。

于 2012-05-09T10:40:23.410 に答える
0

パターンではなく定数文字列を検索する場合、正規表現を使用しない理由はいくつかあります。

  • ユーザーは、正規表現の文法で特別な意味を持つ文字を入力する場合があります。
  • 正規表現は、部分文字列検索に比べて低速です。
  • 意図したよりも多くの機能(正規表現マッチングを使用)をユーザーに許可したくありません。

String.indexOfおよび/またはString.replace代わりに使用してください。

while ((line = readLine()) != null)
    if (line.indexOf(searchString) != -1 )
        line.replace(searchString, replaceString);
于 2012-05-09T10:31:14.980 に答える
0

私はJavaに精通していませんが、ドキュメントによるlookingAtと、文字列の先頭を調べます。一致するものを探すのをスキップして、一致するreplaceAllかどうかに関係なく盲目的に実行します。一致するものがない場合は何も置き換えられません。

何らかの理由で置換を試みる前に一致するものを探す必要がある場合(これは無駄です)、正しい関数はfindです。http://docs.oracle.com/javase/1.4.2/docs/api/java/util/regex/Matcher.htmlを参照してください

于 2012-05-09T10:47:26.837 に答える
0

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

于 2012-05-09T11:32:42.120 に答える