Java 正则表达式:需要更简单的解决方案
Java Regular Expression : Need Simpler Solution
我是正则表达式的新手。我有一个名为 encryptId
的字符串(不包含 |
),我想在该字符串的每 20 个字符后附加 |
字符,使用 encryptId.replace/replaceAll(Regex,Pattern)
中的函数 Java。但它不应该在字符串的末尾有 \
。
感谢您的帮助。
编辑:
我特别想使用 replace
和 replaceAll
函数的原因是因为我必须在 velocity template mananger[=38 中使用它=].在那里我们可以使用普通的字符串函数,但不能编写完整的 java 代码。
我目前的解决方案如下图
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
我是正则表达式的新手。我有一个名为 encryptId
的字符串(不包含 |
),我想在该字符串的每 20 个字符后附加 |
字符,使用 encryptId.replace/replaceAll(Regex,Pattern)
中的函数 Java。但它不应该在字符串的末尾有 \
。
感谢您的帮助。
编辑:
我特别想使用
replace
和replaceAll
函数的原因是因为我必须在 velocity template mananger[=38 中使用它=].在那里我们可以使用普通的字符串函数,但不能编写完整的 java 代码。我目前的解决方案如下图
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