【问题标题】:Putting a space in a string在字符串中放置一个空格
【发布时间】:2013-10-17 13:27:07
【问题描述】:

假设我有一个像“MikeJackson”这样的字符串,我正试图找出一种在两者之间放置一个空格的方法,这样它就变成了“Mike Jackson”。然后将相同的方法应用于另一个字符串说“JohnBull”会给我返回“John Bull”。这是我想出的代码:

public class Test{

    public Test(){

    }
public void sep(String s){
    s = s + " ";
   char[] charArray = s.toCharArray();
   int l = s.length();
for (int i = 0; i < l; i++){
    char p = ' ';

    if(Character.isUpperCase(s.charAt(0))){
        continue;   
    }
    else if (Character.isUpperCase(s.charAt(i))){
        int k = s.indexOf(s.charAt(i));
        charArray[l] = charArray[--l];
        charArray[k-1] = p;
    }
    //System.out.println(s.charAt(i));
}
}
    public static void main (String args[]){

    Test one = new Test();

    one.sep("MikeJackson");
    }  
}

我的想法是在字符串中添加一个空格,以便“MikeJackson”变为“Mike Jackson”,然后将原位字符向右移动(检查我在哪里找到大写字母)忽略第一个大写字母。然后用一个字符' '代替字符'J',但将'J'向右移动。这就是我试图用我的方法实现的目标,但看起来我需要一些指导方针。如果有人可以帮忙。谢谢。

【问题讨论】:

标签: java string


【解决方案1】:

试试这个:

"MikeJackson".replaceAll("(?!^)([A-Z])", " $1");

对于每个上面的字符,我都在前面添加一个空格。

此外,它适用于多个大写单词。 我正在为Word1Word2Word3 收到Word1 Word2 Word3

【讨论】:

  • 解决方案很优雅,:-D
  • 您可以使用 (A-Z)(?!^) 来防止它匹配字符串中的第一个字母。那么你就不必使用 .trim()
  • @Nathanial 那不是“A [A-Z] 后面没有 ^”吗?情况总是如此。 ^ 无法关注任何内容。编辑:在regexpal.com 上测试它不起作用
  • @Cruncher 你说得对,我向前看,而不是向后看。它应该是 (?java-regex-tester.appspot.com 上进行了测试。请注意,regexpal.com 只是一个 JavaScript 正则表达式测试器。
  • @Nathanial Lookbehind/ahead 的语法非常不直观。
【解决方案2】:
public static void sep(String s) {
    StringBuilder result = new StringBuilder();
    for (int i = 0; i < s.length(); i++) {

        result.append(s.charAt(i));
        if (i != s.length() -1 && Character.isUpperCase(s.charAt(i + 1))) {
            result.append(" ");
        }
    }
    System.out.println(result);
}

如果下一个字符是大写,只需添加一个空格。

【讨论】:

  • 在这里坐了几分钟想一个正则表达式解决方案,但这可能只是最简单的
  • 在工作时,考虑到时间和内存,您的方法非常糟糕,但我会投票赞成。
  • @Cruncher:那么最后一个字符将不会被添加。不过,您之前的评论是有效的,我已将其纳入。
【解决方案3】:

这里有类似的问题: Insert Space After Capital letter

尝试一下,如果您有任何问题,请告诉我们!

参考代码在这里:

  String s = "HelloWorldNishant";
    StringBuilder out = new StringBuilder(s);
    Pattern p = Pattern.compile("[A-Z]");
    Matcher m = p.matcher(s);
    int extraFeed = 0;
    while(m.find()){
        if(m.start()!=0){
            out = out.insert(m.start()+extraFeed, " ");
            extraFeed++;
        }
    }
    System.out.println(out);

【讨论】:

  • 这是一个出色而优雅的解决方案。不了解“模式”和“匹配器”会使事情变得艰难。谢谢大家。
【解决方案4】:

使用String.replaceAll

String foo = "SomeLongName";
System.out.println(foo.replaceAll("([a-z]+)([A-Z])", "$1 $2"));

Some Long Name 中的结果。

【讨论】:

  • +1 因为这不会把“Mike\sJackson”变成“Mike\s\sJackson”(\s 是空格。所以不允许我放双空格)
  • 它不适用于所有情况。 Word1Word2Word3 是一个例子,1 不是小写字符,它不会在 1 和 W 之间添加空格。
  • @SilviuBurcea 好吧,OP 并没有建议名字可以有数字。顺便说一句,你可以说 string.replaceAll("([a-z0-9]+)([A-Z])", "$1 $2") 来举例。
【解决方案5】:

字符串是finalimmutable,你不能修改它,你总是用它来创建一个新的并分配给任何变量。

话虽如此,我建议寻找第一个非零索引大写,获取它所在的子字符串,存储两个子字符串并在它们之间添加和空格。

【讨论】:

  • 这是误导。字符串是最终的并不意味着我不能这样做:String s = "1"; s+="2";。这只是意味着我不能扩展它
【解决方案6】:

解决这个问题的最简单方法,在这种情况下是使用正则表达式

    String str = "MikeJackson";
    System.out.println(str.replaceAll("(\\w+?)([A-Z])(\\w+?)", "$1 $2$3"));

产量:Mike Jackson

【讨论】:

    【解决方案7】:
    public static String addSpaces(String str) {
        StringBuilder sb = new StringBuilder();
        if (str.length() == 0) return "";
        sb.append(str.charAt(0));
        for (int i = 1; i < str.length(); i++) {
            if (Character.isUpperCase(str.charAt(i))) sb.append(" ");
            sb.append(str.charAt(i));
        }
        return sb.toString();
    }
    

    【讨论】:

      猜你喜欢
      • 2017-10-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-13
      • 2021-04-18
      • 1970-01-01
      • 2018-05-07
      相关资源
      最近更新 更多