【问题标题】:ReplaceAll in JavaJava中的全部替换
【发布时间】:2016-06-20 02:37:07
【问题描述】:

我使用WordsUtilscapitalize 字样。

由于我无法定义哪些单词应该大写,所以我必须在 capitalize 函数之后再做一个实现,将一些单词小写。

应该是小写的单词是:["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. 何塞·达斯·希尔瓦
    2. 豪尔赫·德保拉
    3. 玛利亚达斯保拉斯

问题在于 replaceAll 将每个单词都放入小写字母,而不仅仅是匹配 Pattern 的介词。

【问题讨论】:

  • 这正是.toLowerCase() 所做的。您需要操纵每场比赛。
  • 由于要检查每个单词的匹配,考虑拆分字符串并一次检查每个单词的匹配而不是整个字符串。
  • @SLaks,我当然知道.toLowerCase() 做了什么,但我只想小写匹配Regex 的单词。
  • 那你显然不知道表达式是如何工作的。

标签: java regex replaceall


【解决方案1】:
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();
        }
}

输出:

何塞·达斯·席尔瓦

豪尔赫·德·保拉

玛丽亚·达斯·保拉斯

【讨论】:

    【解决方案2】:

    没有第三方库的Java8解决方案:

    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();
    }
    

    【讨论】:

    • 感谢您的回复。我测试了第一个输入,它返回错误的结果:“José DAs Silva”,它应该是“José das Silva”。
    • @developer033 哦,我明白了,这些字要小写,那我更新代码
    • 现在它工作得很好,你最后忘记了一个东西(toLowerCase)。相反,它不会小写 String 中的其余字符。谢谢。
    【解决方案3】:

    您正在通过 newWord.replaceAll("\\b([d|D][a-zA-Z]{1,2})\\b", "$1").toLowerCase(); 将整个字符串转换为小写。您应该只将匹配项转换为小写。

    下面是代码 sn-p,它首先将输入字符串转换为大写,然后查找并将每个匹配项转换为小写。

    代码片段:

    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
    

    【讨论】:

      【解决方案4】:

      所以您希望所有单词都大写,但您指定的单词? 或者您不希望任何单词大写,并且如果该单词与指定的单词匹配,那么您希望将其转换为小写?

      第一种情况: 您需要小心并确定是否要小写 或任何包含该词的词,例如 达萨达达 如果仅与您指定的单词特别匹配,则

      Str.matches("firstword|secondword");
      

      或者如果任何包含这些词的词 Str.matches("(.*)firstword(.*)|(.*)secondword(.*)");

      第二种情况: 那你就不需要String newWord = WordUtils.capitalizeFully(word);

      【讨论】:

        【解决方案5】:

        尝试在使用正则表达式和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;
        

        【讨论】:

          猜你喜欢
          • 2014-06-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-11-27
          • 2015-03-06
          • 1970-01-01
          • 1970-01-01
          • 2016-02-23
          相关资源
          最近更新 更多