【问题标题】:Add delimiter if String contains a character?如果字符串包含字符,则添加分隔符?
【发布时间】:2021-02-07 23:19:55
【问题描述】:

我试图弄清楚如何使用循环在发现字符串 s 包含字母 A-F 之前附加分隔符“:”。

如果我有 s = "10584f" 那么我希望输出为 "10584:f"

我该怎么做呢?

【问题讨论】:

  • "1abc"这样的字符串呢?它应该变成1:abc1:a:b:c 还是别的什么?
  • 输入的长度是否固定?
  • 应该是1:a:b:c
  • 输入的长度不固定,依赖用户输入
  • str = str.replaceAll("[a-fA-F]", ":$0");

标签: java string loops for-loop


【解决方案1】:

这是一个简单的解决方案,检查它是否包含 a 到 f 之间的字母并相应地放置 `:'。

public static void main(String[] args) {
            String s = "10584f";
            String newString = "";
            for(int i=0;i<s.length();i++) {
                if((int)s.charAt(i)>= (int)'a' &&  (int)s.charAt(i)<= (int)'f') {
                    newString = newString + ":" + s.charAt(i);
                }else {
                    newString = newString  + s.charAt(i);
                }
            }
            System.out.println(newString);
        }

【讨论】:

  • 使用 StringBuilder。
【解决方案2】:

在这种情况下,您需要检查每个字符的ASCII 代码并在其前面附加分隔符:

public class Main {
    public static void main(String[] args) {
        String s = "10584f";
        System.out.println(appendDelimiter(s));
    }

    private static String appendDelimiter(String s) {
        StringBuilder sb = new StringBuilder();
        for(char c : s.toCharArray()) {
            int charCode = (int) c;
            if((charCode >= 65 && charCode <= 70) || (charCode >= 97 && charCode <= 102))
                sb.append(":");
            sb.append(c);
        }
        return sb.toString();
    }
}

输出:

10584:f

【讨论】:

    【解决方案3】:

    如果您的目标字符串由数字后跟来自A-Fa-f 的单个字母组成,一个简单的解决方案可以是:替换正则表达式匹配,(\\d+)([A-Fa-f])。这个正则表达式表示group(1) 由数字组成,group(2) 由来自A-Fa-f 的字母组成。正则表达式可以替换为$1:$2,其中$1$2 分别指定group(1)group(2)

    import java.util.Arrays;
    
    public class Main {
        public static void main(String[] args) {
            // Test strings
            String[] arr = { "10584f", "12345A", "13456b", "23456F" };
            for (int i = 0; i < arr.length; i++) {
                arr[i] = arr[i].replaceAll("(\\d+)([A-Fa-f])", "$1:$2");
            }
    
            // After replacement
            System.out.println(Arrays.toString(arr));
        }
    }
    

    输出:

    [10584:f, 12345:A, 13456:b, 23456:F]
    

    但是,如果字符串可以有多个字母后跟数字,并且您希望每个字母都以 : 开头,则可以从索引 1 开始迭代字符串,直到字符串的最后一个字符和如果您遇到一封信,请在其前面加上 :,就像函数中所做的那样,withColonBeforeLetters 如下所示:

    演示:

    import java.util.Arrays;
    
    public class Main {
        public static void main(String[] args) {
            // Test strings
            String[] arr = { "10584f", "12345A", "13456b", "23456F", "1abc", "123aBc" };
            for (int i = 0; i < arr.length; i++) {
                arr[i] = withColonBeforeLetters(arr[i]);
            }
    
            // After replacement
            System.out.println(Arrays.toString(arr));
        }
    
        static String withColonBeforeLetters(String s) {
            StringBuilder sb = new StringBuilder();
    
            // Put the first letter into sb
            sb.append(s.charAt(0));
    
            for (int i = 1; i < s.length(); i++) {
                char ch = s.charAt(i);
                if ((ch >= 'A' && ch <= 'F') || (ch >= 'a' && ch <= 'f')) {
                    sb.append(':').append(ch);
                } else {
                    sb.append(ch);
                }
            }
            return sb.toString();
        }
    }
    

    输出:

    [10584:f, 12345:A, 13456:b, 23456:F, 1:a:b:c, 123:a:B:c]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-27
      • 2019-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多