Сплит Java пожирает моих персонажей - PullRequest
16 голосов
/ 12 мая 2010

У меня есть такая строка String str = "la$le\\$li$lo".

Я хочу разделить ее, чтобы получить следующий вывод "la","le\\$li","lo".\ $ - это экранированный $, поэтому его нужно оставить в выходных данных.

Но когда я делаю str.split("[^\\\\]\\$") y, получаю "l","le\\$l","lo".

Из того, что я получаю, мое регулярное выражение соответствует$ и я $ и удаление затем.Есть идеи, как вернуть моих персонажей?

Спасибо

Ответы [ 4 ]

21 голосов
/ 12 мая 2010

Использовать утверждения соответствия нулевой ширины:

    String str = "la$le\\$li$lo";
    System.out.println(java.util.Arrays.toString(
        str.split("(?<!\\\\)\\$")
    )); // prints "[la, le\$li, lo]"

Регулярное выражение по существу

(?<!\\)\$

Он использует отрицательный взгляд назад, чтобы утверждать, что нет предшествующего \.

Смотри также


Больше примеров разбиения на утверждения

Простое разбиение предложения с сохранением знаков препинания:

    String str = "Really?Wow!This.Is.Awesome!";
    System.out.println(java.util.Arrays.toString(
        str.split("(?<=[.!?])")
    )); // prints "[Really?, Wow!, This., Is., Awesome!]"

Разделение длинной строки на части фиксированной длины, используя \G

    String str = "012345678901234567890";
    System.out.println(java.util.Arrays.toString(
        str.split("(?<=\\G.{4})")
    )); // prints "[0123, 4567, 8901, 2345, 6789, 0]"

Использование комбо lookbehind / lookahead:

    String str = "HelloThereHowAreYou";
    System.out.println(java.util.Arrays.toString(
        str.split("(?<=[a-z])(?=[A-Z])")
    )); // prints "[Hello, There, How, Are, You]"

Похожие вопросы

2 голосов
/ 12 мая 2010

Причина удаления $ и i $ состоит в том, что регулярное выражение [^\\]\$ соответствует любому символу, за которым не стоит '\', за которым следует '$'. Вам нужно использовать утверждения нулевой ширины

Это та же самая проблема, с которой люди пытаются найти q, а не u.

Первое сокращение в правильном регулярном выражении: /(?<!\\)\$/ ("(?<!\\\\)\\$" в Java)

class Test {
 public static void main(String[] args) {
  String regexp = "(?<!\\\\)\\$";
  System.out.println( java.util.Arrays.toString( "1a$1e\\$li$lo".split(regexp) ) );
 }
}

Урожайность:
[1a, 1e\$li, lo]

1 голос
/ 12 мая 2010

Вы можете сначала попытаться заменить "\ $" другой строкой, такой как кодировка URL для $ ("% 24"), а затем разделить:

String splits[] = str.replace("\$","%24").split("[^\\\\]\\$");
for(String str : splits){
   str = str.replace("%24","\$");
}

В более общем смысле, если str построен чем-то вроде

str = a + "$" + b + "$" + c

Затем вы можете URLEncode a, b и c, прежде чем добавлять их вместе

import java.net.URLEncoder.encode;
...
str = encode(a) + "$" + encode(b) + "$" + encode(c)
0 голосов
/ 12 мая 2010
import java.util.regex.*;
public class Test {
    public static void main(String... args) {
        String str = "la$le\\$li$lo";
        Pattern p = Pattern.compile("(.+?)([^\\\\]\\$)");
        Matcher m = p.matcher(str);
        while (m.find()) {
            System.out.println(m.group(1));
            System.out.println(m.group(2));
        }
    }
}

дает

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