繁体   English   中英

正则表达式(Java):如何用“|”替换“||” |“反复

[英]Regex (Java): How do I replace “||” with “| |” repeatedly

如果我有一串管道分隔的数据:

123456|abcd|||65464|hgfhgf

如何替换||任何出现 与: | | | |

所以最终看起来像这样:

123456|abcd| | |65464|hgfhgf

我尝试使用简单的Java表达式:

delimString.replaceAll("\\\|\\\|", "| |");

但这只取代了第一次出现:

123456|abcd| ||65464|hgfhgf

所以我需要一些东西让它重复(我认为贪婪)。

String resultString = subjectString.replaceAll("\\|(?=\\|)", "| ");

正则表达式解释没有Java的双反斜杠:

\|   # Match a literal |
(?=  # only if it's followed by
 \|  # another literal |.
)    # End of lookahead assertion

你甚至可以狂野地用空格字符替换两个管道之间的空白区域

String resultString = subjectString.replaceAll("(?<=\\|)(?=\\|)", " ");

问题在于匹配位置已超过第二个| 你换了,所以不算数。 你必须使用while循环才能做到这一点。

我同意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);

在我犯错误之前对我的回答感到抱歉。 我刚刚更新了。

这是另一种可以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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM