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

Java Regular Expression : Need Simpler Solution

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

感谢您的帮助。

编辑:

  1. 我特别想使用 replacereplaceAll 函数的原因是因为我必须在 velocity template mananger[=38 中使用它=].在那里我们可以使用普通的字符串函数,但不能编写完整的 java 代码。

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

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

我需要删除这个 if 语句,这样它就只是一个字符串函数。

您可以使用 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.

的末尾

你问怎么用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();
}

正则表达式可能会使事情变得更加复杂。您也可以为此尝试使用 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, "|");
            }
        }

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

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

        return str.replaceAll(regex, replacement);
    }

只需使用

enterADelimiter(yourString, "|", 20)

这将 return 正确的解决方案。解释

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