5

問題は次のとおりです。ユーザーにはテキストフィールドが表示され、そこにフィルターを入力できます。フィルター処理されていないデータをフィルター処理するためのフィルター。Oracle Formsの洗脳を経験しているユーザーは、%以外の特殊文字を使用していません。これは、Javaでは多かれ少なかれ「。*」正規表現を表していると思います。

ユーザーパーソンが適切に動作している場合、特定のパーソンは「CTHULH%」のようなものを入力します。その場合、パターンを作成できます。

Pattern.compile(inputText.replaceAll("%", ".*"));

しかし、ユーザーパーソンがインスマス出身の場合、彼は「。+ \ [a-#$%^&*(」と入力すると、数回の簡単なキーストロークで私のスキームが破壊されます。これは機能しません。

Pattern.compile(Pattern.quote(inputText).replaceAll("%", ".*"));

文字列の最初に\Q、最後に\ Eを配置するため、%->。*switchmootがレンダリングされます。

問題は、パターンコード内のすべての特殊文字を検索し、前に「\\」を追加して自分でエスケープする必要があるのか​​、それとも自動的に実行できるのかということです。それとも私は問題に深く関わっていますか、私はいくつかの明白な解決方法を省略していますか?

4

2 に答える 2

6

このアルゴリズムはあなたのために働くはずだと思います:

  • スプリットオン%
  • を使用して各部分を個別に引用するPattern.quote
  • を使用して文字列を結合します.*
于 2012-05-09T15:06:40.363 に答える
2

どうPattern.compile(Pattern.quote(inputText).replaceAll("%", "\\E.*\\Q"));ですか?

これにより、次のパターンが生成されます。

input:   ".+\[a-#$%^&*(" 
quote:   \Q".+\[a-#$%^&*("\E 
replace: \Q".+\[a-#$\E.*\Q^&*("\E

%文字が最初または最後の文字である場合は、(入力しかない場合、式は最終的に になります)が得られますが\Q\E%これ\Q\E.*\Q\Eはまだ有効な式である必要があります。

更新

と の違いを忘れていreplace(...)ましreplaceAll(...)た。前者の置換パラメーターはリテラルですが、後者の置換は式そのものです。したがって、コメントですでに述べたように、呼び出す必要がありますPattern.compile(Pattern.quote(inputText).replaceAll("%", "\\\\E.*\\\\Q"));(文字列と式のバックスラッシュを引用してください)。

のドキュメントからString#replaceAll(...)

置換文字列にバックスラッシュがあると、リテラル置換文字列として扱われる場合とは結果が異なる場合があることに注意してください。

于 2012-05-09T15:11:19.600 に答える