1

正規表現を使用して指定されたパターンを切り詰めようとしていますが、代わりに必要な文字も置き換えます。この場合、境界を指定しても役に立ちません。

 String name = "Dr.Dre" ;  
     Pattern p = Pattern.compile("(Mr.|MR.|Dr.|mr.|DR.|dr.|ms.|Ms.|MS.|Miss.|Mrs.|mrs.|miss.|MR|mr|Mr|Dr|DR|dr|ms|Ms|MS|miss|Miss|Mrs|mrs)"+"\\b");
     Matcher m = p.matcher(name);
     StringBuffer sb = new StringBuffer();
     String namef = m.replaceAll("");    
     System.out.println(namef);

入力:Dr.DreまたはDrDreまたはDr.Dre

>出力(期待):DreまたはDreまたはDre

編集:

助けてくれてありがとう、しかし私が直面している正規表現の問題はほとんどありません:プログラム:

String name = "Dr. Dre" ;  
Pattern p = Pattern.compile("(Mr\\.|MR\\.|Dr\\.|mr\\.|DR\\.|dr\\.|ms\\.|Ms\\.|MS\\.|Miss\\.|Mrs\\.|mrs\\.|miss\\.|MR|mr|Mr|Dr|DR|dr|ms|Ms|MS|miss|Miss|Mrs|mrs)"+"\\b");
Matcher m = p.matcher(name);
String namef = m.replaceAll(""); 
System.out.println(namef);

上記のプログラムの場合、次のように出力を受け取ります。目的の出力が次の場合のDre:Dre

4

2 に答える 2

7

正規表現のドットは「任意の文字」を意味します。バックスラッシュでエスケープする必要があります。バックスラッシュは、文字列リテラルでエスケープする必要があります。

Pattern p = Pattern.compile("Mr\\.|MR\\.|Dr\\.|mr\\.|DR\\.|dr\\.|ms\\."); // etc

「Dr.」を削除すると、スペースが2倍になることに注意してください。「またはドクター・ドレー」から…

編集:何らかの理由で(理由はわかりませんが)、ドットの後のスペースは単語の境界としてカウントされません。\\sの代わりに使用するようにパターンを変更した場合\\b、単一の空白文字を置き換えると、「Dr。Dre」では機能しますが、コメントに記載されているように、「Dr.Dre」では失敗します。単語の境界を完全に削除して、パターンの後半部分( "DR | Dr |"など)にスペースを追加するか、(\\s|\\b)試してみた場合に機能するものを使用できますが、他の望ましくない副作用が発生する可能性があります。

于 2012-11-05T07:38:31.173 に答える
2

質問は少し不明確ですが (問題のある結果を提供していません)、問題はピリオド文字の使用にあると思います。ピリオドは正規表現で意味を持ちます。どの文字にも一致するため、「Dr.」* Dr.D *reと実際に一致します。「博士」のようにエスケープする必要があります。または、具体的にはコード内で、"Dr\." のようにエスケープ スラッシュをエスケープします。

それが役立つことを願っています!

于 2012-11-05T07:40:57.713 に答える