2017-08-08 4 views
0

「18 rue d'Armenie」や「25 boulevard d'Armes」の「18 rue D'armenie」や「25 boulevard D'armes」のような文字列を変更しようとしています。 この変更をString.replaceする方法?フランス語の住所の大文字の訂正。どのように文字列の大文字に変更するには、regex/javaの特定の文字の後に?

私は、現時点ではやっていることは、このようなものです:

street.replace("'[a-zA-z]", "'[a-zA-Z]".toUpperCase()); 

はありがとう:私は2番目のこのような何かをやって置き換えを追加したい

WordUtils.capitalizeFully(street.trim()).replace(" D'", " d'"); 

+0

? –

+0

@WiktorStribiżew長い文字列では、すべての単語の最初の文字を大文字に変更します。それはちょうどその言葉が "D armes"である場合、 "d'Armes"でなければならないので、この変更だけを行う文字列に置き換えを追加しようとしています。 – user3450862

答えて

0

String name = "stackoverflow"; name = name.substring(0,1).toUpperCase() + name.substring(1).toLowerCase();

nameの値が"Stackoverflow"

more example

+0

1.変更はD'a ... to d'A ...でなければなりません。2.その構造は文字列の最初のものではないかもしれません。 – Gangnus

2

であるあなたは、次のいずれかで、あなたのコードを置き換えることがあります。

String s = "25 a-b boulevard d'armes Boulevard D'armes"; 
StringBuffer result = new StringBuffer(); 
Matcher m = Pattern.compile("\\b(D)(?=')|\\b(?<!-)\\p{L}(?!')").matcher(s); // Or "\\b(?:(D)(?=')|(?<!-)\\p{L}(?!'))" to make it a bit more efficient 
while (m.find()) { 
    if (m.group(1) == null) { 
     m.appendReplacement(result, m.group(0).toUpperCase()); 
    } else { 
     m.appendReplacement(result, m.group(1).toLowerCase()); 
    } 
} 
m.appendTail(result); 
System.out.println(result.toString()); 
// => 25 A-b Boulevard d'Armes Boulevard d'Armes 

Java online demoを参照してください。

パターンが詳細

  • \\b - 単語境界
  • (D) - グループ1:ある大文字D手紙...
  • (?=') - '
  • |に続く - または...
  • \\b - ワード境界
  • (?<!-) - その-(複合語の一部を活用していない)
  • \\p{L}に先行されていません - 任意のUnicode文字(あなたが道で、小文字のみのものと一致するように\\p{Ll}を使用することができます)
  • (?!') - その手紙には'を付けるべきではありません。

NOTE:、\\b(D|L)または、より良い、\\b([DL])(これらはシーケンス文字のない限り:あなたはd'用としてl'に同じ動作をする場合、および同様、あなたがグループ1に代わるものを追加することができますあなたは交代演算子を使用する必要があります)。あなたはそれを複雑になぜ「」大文字

+0

'25大通りd'armes 'の場合は動作しません –

+0

@VladBocheninその部分は' WordUtils.capitalizeFully'で覆われています –

+0

はい、D' – Gangnus

0
String s = "18 rue D'armenie"; 
Pattern p = Pattern.compile("([A-Z])'"); 
Matcher m = p.matcher(s); 
StringBuffer sb = new StringBuffe`enter code here`r(); 
while (m.find()) { 
    m.appendReplacement(sb, m.group(1).toLowerCase()); 
} 
m.appendTail(sb); 
System.out.println(sb.toString()); // 18 rue d'armenie 

?複数の区切り文字をWordUtilsに渡すことができます。capitalizeFully()

だから、あなたの問題を解決するには、同じくらい簡単になる:期待される結果が何であるかを

WordUtils.capitalizeFully(street.trim(), '\'', ' ').replace(" D'", " d'"); 
0

を作ることができます。同様に

関連する問題