我是正则表达式的新手。我有一个名为encryptId
的字符串(不包含|
),我希望在此字符串的每20个字符后附加|
字符,使用Java中的encryptId.replace/replaceAll(Regex,Pattern)
函数。但它不应该在字符串的末尾有\
。
感谢您的帮助。
编辑:
我特别想使用replace
和replaceAll
函数的原因是因为我必须在 velocity template mananger 中使用它。我们可以使用常见的String函数,但不能编写整个java代码。
我目前的解决方案如下所示
encryptId = encryptId.replaceAll("(.{20})","$1|"); if(encryptId.charAt(encryptId.length() - 1)=='|') { encryptId = encryptId.substring(0,encryptId.length()-1); }
我需要摆脱这个if
语句,以便它只是一个字符串函数。
答案 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