2016-03-06 2 views
0

Я использую WordsUtils до capitalize слов.ReplaceAll в Java

Поскольку я не могу определить, какие слова должны быть капитализированы, я должен сделать другую реализацию после функции capize, чтобы поместить несколько слов в нижний регистр.

Слова, которые должны быть строчными буквами: ["da, de, di, do, du, das, des, dis, dos, dus"].

Итак, мой code на данный момент:

public static String capitalize(String word) { 
    String newWord = WordUtils.capitalizeFully(word); 
    newWord = newWord.replaceAll("\\b([d|D][a-zA-Z]{1,2})\\b", "$1").toLowerCase(); 
    return newWord; 
} 
  • Пример входов:

    1. josé даш-SILVA
    2. Jorge De Paula
    3. MaRiA DAS Paulas

Проблема заключается в том, что replaceAll помещает каждое слово в нижнем регистре, а не только предлоги, соответствующие Pattern.

+2

Это именно то, что '.toLowerCase()' делает. Вам нужно манипулировать каждым матчем. – SLaks

+0

Поскольку вы хотите проверить соответствие за слово, подумайте о том, чтобы разделить строку и проверить совпадение за слово, а не целую строку сразу. – Ian

+0

@SLaks, конечно, я знаю, что делает '.toLowerCase()', но я хочу, чтобы lowerCase только слово, которое соответствует 'Regex'. – developer033

ответ

4

Java8 решение без LIBS третьих лиц:

public static void main(String[] args) { 
    String str = "hello mY dEAr friends"; 
    Set<String> ban = new HashSet<>(Arrays.asList("my", "dear")); 
    String result = Arrays.stream(str.split("\\s")) 
          .map(s -> capitalize(s, ban)) 
          .collect(Collectors.joining(" ")); 
    System.out.println(result); 
} 

static String capitalize(String s, Set<String> ban) { 
    String lc = s.toLowerCase(); 
    return ban.contains(lc) ? lc 
          : Character.toUpperCase(s.charAt(0)) + s.substring(1).toLowerCase(); 
} 
+0

Спасибо за ответ. Я протестировал первый вход, и он возвращает мне неправильный результат: «José DAs SIlVa», это должно быть «Хосе дас Сильва». – developer033

+1

@ developer033 О, я вижу, вам нужно загладить эти слова, я обновлю код, затем – AdamSkywalker

+0

Теперь он отлично работает, вы в конце концов просто забыли (toLowerCase). Вместо этого он не будет содержать нижний регистр остальных символов в String. Благодарю. – developer033

0

Попробуйте поставить условие, проверяя, если слово является мишенью перед использованием регулярных выражений и toLowerCase

List<String> str = Arrays.asList("da, de, di, do, du, das, des, dis, dos, dus".split(", ")); 
newWord = str.contains(word) ? 
      newWord.replaceAll("\\b([d|D][a-zA-Z]{1,2})\\b", "$1").toLowerCase() : 
      newWord; 
+0

Спасибо за ответ, но он не работает. – developer033

0

так что вы хотите, чтобы все слова капитализироваться, но слова, которые вы указали? или вы не хотите, чтобы слово было заглавным и если слово соответствует одному из указанных, вам нравится преобразовывать его в нижний регистр?

первый случай: вам нужно позаботиться и определить, если вы хотите строчные буквы дас или любое слово, которое содержит это слово как dasadada если только специально совпадает с слово вы указали тогда

Str.matches("firstword|secondword"); 

или если любое слово, содержащее эти слова Str.matches("(.*)firstword(.*)|(.*)secondword(.*)");

второй случай: тогда вам не нужно String newWord = WordUtils.capitalizeFully(word);

0

Вы конвертируете всю строку в нижний регистр, делая newWord.replaceAll("\\b([d|D][a-zA-Z]{1,2})\\b", "$1").toLowerCase();. Вы должны преобразовывать совпадения в нижний регистр.

Ниже приведен фрагмент кода, который сначала преобразует входную строку в верхний регистр, а затем находит & конвертировать каждое соответствие в нижний регистр.

Код сниппета:

public static void main(String[] args) { 
    String str = "josé dAs sIlVa".toUpperCase(); 
    Matcher m = Pattern.compile("D(A|E|I|O|U|AS|ES|IS|OS|US)").matcher(str); 

    while(m.find()) { 
     String match = m.group(0); 
     str = str.replace(match,match.toLowerCase()); 
    } 

    System.out.println(str); 
} 

Вход:

josé dAs sIlVa 

Выход:

JOSÉ daS SILVA 
0
class MyClass 
{ 
    public static void main (String[] args) throws java.lang.Exception 
    { 

     String[] wordArray = {"jose dAs sIlVa","Jorge De PAuLa","MaRiA DAS PauLas"}; 
     for(int i=0;i<wordArray.length;i++){ 
     System.out.println(capitalize(wordArray[i])); 
     } 
    } 

    static String capitalize(String word) { 
      if(word!=null && word!=""){ 
       String[] wordArray = word.trim().split(" "); 
       word= ""; 
       for(int i=0;i<wordArray.length;i++){ 
        String currentWord = wordArray[i].trim(); 
        if(currentWord.matches("\\b([d|D][a-zA-Z]{1,2})\\b")){ 
         currentWord = currentWord.toLowerCase(); 
        }else{ 
         currentWord = currentWord.toUpperCase(); 
        } 
        word = word+" "+currentWord; 
       } 
      } 
      return word.trim(); 
     } 
} 

Выход:

JOSE дас SILVA

ХОРХЕ де Паула

МАРИЯ дас Paulas