Regex (Java): как заменить «||»с "| |"несколько раз - PullRequest
5 голосов
/ 05 апреля 2011

Если у меня есть строка данных, разделенных каналом:

123456|abcd|||65464|hgfhgf

Как я могу заменить любое вхождение || на: | |?

Так что это закончитсявыглядело так:

123456|abcd| | |65464|hgfhgf

Я пытался использовать простое выражение Java:

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

, но это заменило только первое вхождение:

123456|abcd| ||65464|hgfhgf

Так что мне нужночто-то, чтобы заставить это повториться (жадно, я думаю).

Ответы [ 4 ]

10 голосов
/ 05 апреля 2011
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 голос
/ 05 апреля 2011

Я согласен с 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);
1 голос
/ 05 апреля 2011

Проблема здесь в том, что позиция матча уже прошла за 2 | Вы заменили, поэтому это не считается. Вам придется использовать цикл while для этого.

0 голосов
/ 05 апреля 2011

Извините за мой ответ, прежде чем я сделал ошибку. Я только что обновил.

Это альтернатива, которая будет работать на 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...