3

文字列に含まれている場合を除いて、ファイル内の単語が表示されるたびに置き換えようとしています。

だから私はで交換thisする必要があります

The test in this line consists in ... 

ただし、次の場合は一致しないでください:

The test "in this line" consist in ... 

これは私がしようとしているものです:

 line.replaceAll( "\\s+this\\s+", " that ")

しかし、このシナリオでは失敗するので、次を使用してみました:

 line.replaceAll( "[^\"]\\s+this\\s+", " that ")

しかし、どちらも機能しません。

どんな助けでもいただければ幸いです

4

2 に答える 2

3

これは機能しているようです(提供された例から要件を理解している限り):

 (?!.*\s+this\s+.*\")\s+this\s+

http://rubular.com/r/jZvR4XEbRf

Java のエスケープを調整する必要がある場合があります。

これは実際には少し優れています:

 (?!\".*\s+this\s+)(?!\s+this\s+.*\")\s+this\s+
于 2011-10-26T03:47:20.067 に答える
2

これを行う唯一の信頼できる方法は、引用符で囲まれた完全なシーケンスまたは検索語のいずれかを検索することです。これを 1 つの正規表現で行い、一致するたびに、どの正規表現に一致したかを判断します。それが検索語である場合は、それを置き換えます。それ以外の場合は、そのままにしておきます。

使えないということですねreplaceAll()。代わりに、それ自体と同じようにappendReplacement()andappendTail()メソッドを使用する必要があります。replaceAll()次に例を示します。

String s = "Replace this example. Don't replace \"this example.\" Replace this example.";
System.out.println(s);

Pattern p = Pattern.compile("\"[^\"]*\"|(\\bexample\\b)");
Matcher m = p.matcher(s);
StringBuffer sb = new StringBuffer();

while (m.find())
{
  if (m.start(1) != -1)
  {
    m.appendReplacement(sb, "REPLACE");
  }
}
m.appendTail(sb);
System.out.println(sb.toString());

出力:

Replace this example. Don't replace "this example." Replace this example.
Replace this REPLACE. Don't replace "this example." Replace this REPLACE.

オンラインでデモを見る

私は、すべての引用符が重要であり、エスケープできないと想定しています。つまり、ソース コードではなく、散文を扱っているということです。エスケープされた引用符は処理できますが、正規表現が非常に複雑になります。

本当に を使用する必要replaceAll()がある場合、先読みを使用して、一致の後に偶数個の引用符が続くことをアサートするトリックがあります。しかし、それは本当に醜く、大きなテキストの場合、パフォーマンスの点で法外にコストがかかることに気付くかもしれません。

于 2011-10-26T05:41:34.127 に答える