如果我有一串管道分隔的数据:
123456|abcd|||65464|hgfhgf
如何将||
的任何内容替换为:| |
?
所以最终看起来像这样:
123456|abcd| | |65464|hgfhgf
我尝试使用简单的Java表达式:
delimString.replaceAll("\\\|\\\|", "| |");
但只替换了第一次出现:
123456|abcd| ||65464|hgfhgf
所以我需要一些东西让它重复(我认为贪婪)。
答案 0 :(得分:10)
String resultString = subjectString.replaceAll("\\|(?=\\|)", "| ");
正则表达式解释没有Java的双反斜杠:
\| # Match a literal |
(?= # only if it's followed by
\| # another literal |.
) # End of lookahead assertion
你甚至可以狂野并用空格字符替换两个管道之间的空格:
String resultString = subjectString.replaceAll("(?<=\\|)(?=\\|)", " ");
答案 1 :(得分:1)
问题在于匹配位置已超过第二个|你换了,所以不算数。 你必须使用while循环才能做到这一点。
答案 2 :(得分:1)
我同意Ingo - 循环解决方案是更多的代码行,但更容易理解(至少它不需要解释;)):
String test = "abc|def||ghi|||jkl";
StringBuilder result = new StringBuilder();
char previous = 0;
for (char c:test.toCharArray()) {
if (c == '|' && previous == '|')
result.append(" ");
result.append(c);
previous = c;
}
System.out.println(result);
答案 3 :(得分:0)
在我犯错误之前对我的回答感到抱歉。我刚刚更新了。
这是另一种可以100%肯定的工作方式:
public static void main(String [] args) {
String data = "123456|abcd|||65464|hgfhgf";
String modified = "";
for(int i = 0; i < data.length();i++) {
if(data.charAt(i) == '|') {
modified += "| |";
}
else {
modified += "" + data.charAt(i);
}
}
System.out.print(modified);
}
最后它将如下所示:
123456 | | ABCD | || || | 65464 | | hgfhgf