Java正则表达式:需要更简单的解决方案

时间:2015-11-26 16:30:39

标签: java regex replaceall

我是正则表达式的新手。我有一个名为encryptId的字符串(不包含|),我希望在此字符串的每20个字符后附加|字符,使用Java中的encryptId.replace/replaceAll(Regex,Pattern)函数。但它不应该在字符串的末尾有\

感谢您的帮助。

编辑:

  1. 我特别想使用replacereplaceAll函数的原因是因为我必须在 velocity template mananger 中使用它。我们可以使用常见的String函数,但不能编写整个java代码。

  2. 我目前的解决方案如下所示

  3. encryptId = encryptId.replaceAll("(.{20})","$1|");
    if(encryptId.charAt(encryptId.length() - 1)=='|') {
        encryptId = encryptId.substring(0,encryptId.length()-1);
    }
    

    我需要摆脱这个if语句,以便它只是一个字符串函数。

4 个答案:

答案 0 :(得分:1)

您可以使用String.toCharArray

    String s = "..."; //your string
    int i = 0;
    StringBuilder res = new StringBuilder("");
    for (char c : s.toCharArray()){
        res.append(c);
        i++;
        if (i % 20 == 0 && i != s.length()){
            res.append("|");
        }
    }
    System.out.println(res.toString());

res会让您的第一个String每20个字符|,但不会在String的末尾。

答案 1 :(得分:1)

你问过replaceAll如何做到这一点:我说不要。正则表达式并不总是解决字符串操作问题的最佳方法。

您可以通过从encryptId获取20个字符块并将它们附加到StringBuilder来有效地构建新字符串,如果它不在字符串的末尾,则可以选择附加管道:

String method(String encryptId) {
  StringBuilder sb = new StringBuilder(encryptId.length() + encryptId.length() / 20);
  for (int i = 0; i < encryptId.length(); i += 20) {
    int end = Math.min(i + 20, encryptId.length());
    sb.append(encryptId, i, end);
    if (end != encryptId.length()) {
      sb.append('|');
    }
  }
  return sb.toString();
}

答案 2 :(得分:0)

正则表达式可能会使事情变得更复杂。您也可以尝试使用StringBuilder

        String encryptId = "test";
        StringBuilder builder = new StringBuilder(encryptId);

        int insertAfter = 20;
        for(int i = encryptId.length(); i > 0 ; i--) {
            if (i % insertAfter == 0 && i != encryptId.length()) {
                builder.insert(i, "|");
            }
        }

答案 3 :(得分:0)

这可以通过正则表达式完成,如下所示

static String enterADelimiter(String str, String delimiter, int after) {
        String regex = "(.{" + after +"})(?!$)";
        String replacement = "$1" + delimiter;

        return str.replaceAll(regex, replacement);
    }

只需使用

enterADelimiter(yourString, "|", 20)

这将返回正确的解决方案。 Explantion

(            Start group 1
  .          Match Anything
  {after}    after times
)            End group 1
(?!$)        Don't match if at end of String