Java регулярное выражение: разделение на "/", который не находится в начале строки - PullRequest
3 голосов
/ 09 августа 2011

Я хочу разделить a/bc/de/f как [a, bc, de, f], но /a/bc/de/f как [/a, bc, de, f].

Есть ли способ разбить на /, который находится не в начале строки? (У меня плохой день регулярных выражений.)

Ответы [ 3 ]

10 голосов
/ 09 августа 2011

(?!^)/, кажется, работает:

public class Funclass{
    public static void main(String [] args) {
        String s = "/firstWithSlash/second/third/forth/fifth/";
        String[] ss = s.split("(?!^)/");
        for (String s_ : ss)
            System.out.println(s_);

    }
}

вывод:

/firstWithSlash
second
third
forth
fifth

Как прокомментировал @ user unknown , это неправильное выражение,это должно быть (?<!^)/ для обозначения негативного взгляда сзади.

3 голосов
/ 09 августа 2011

Самое простое решение - просто разделить s.substring(1) на /, а затем добавить s.charAt(0) к первому результату.

Кроме этого, поскольку разделенное регулярное выражение не привязано, это будет сложно сделать. Вы бы хотели разделить на «что-то, что не является началом строки, за которым следует косая черта», т. Е. [^^ ]/, но это будет означать, что символ, предшествующий слешу, также был удален. Чтобы сделать это, вам понадобится негативный взгляд, но я не думаю, что синтаксис поддерживается в регулярных выражениях String.split.

Редактировать: Согласно шаблону javadocs создается впечатление, что Java поддерживает отрицательный взгляд назад , и следующее регулярное выражение может выполнять эту работу:

s.split("(?<!^)/");

Быстрый тест показывает, что это действительно делает то, что вы хотите.

3 голосов
/ 09 августа 2011

Не могли бы вы просто добавить проверку в начале, чтобы увидеть, есть ли косая черта в начале?

if( str.charAt(0) == '/' ) {
    arr = str.substring(1).split( "/" );
    arr[0] = "/"+arr[0];
} else
    arr = str.split( "/" );

Или немного проще:

arr = str.charAt(0) + str.substring(1).split( "/" );

Если первыйэто косая черта, она просто ударит по косой черте в начале первого токена.Если в первом токене есть только один символ (который не начинается с косой черты), то первый элемент массива является пустой строкой, и он все равно будет работать.

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