шаблон списка исключений регулярных выражений Java - PullRequest
1 голос
/ 10 ноября 2011

Я понимаю, что когда я сделаю [^ abc], это будет соответствовать любой вещи, кроме a, b и c.Что, если я хочу, чтобы оно совпадало с чем-то, кроме "..".Пока что у меня есть список исключений:

[^ <>: \ "/ \ |? *] +

Я хочу добавить и" .. "в этот список исключенийТаким образом, на английском языке это будет «если это что-то, кроме левых скобок, правых скобок, двойных кавычек, звездочек, двойной точки (« .. »), остальные символы здесь, то оно должно совпадать».

Тестовый пример, который мне нужно пройти:

foo/../baz needs to be /baz
bar/../../foo needs to be /../foo

Ответы [ 5 ]

0 голосов
/ 10 ноября 2011

@ xonegirlz - Способ исключения .. зависит от того, что вы пытаетесь сделать. Ваш " тестовый пример, который мне нужно пройти " - некоторая помощь, но утверждение " должно быть " является расплывчатым.

Было бы полезно, если бы вы могли сформулировать это как

"I'm writing a function X that, given a String like Y,
would return a String like Z.
I'm trying to use a regex-replace to find ______ in Y
and replace all execpt _______ to return Z".

Ваш текущий вопрос задает только об отрицанных классах символов, и ответ на этот вопрос Вы не можете делать ("..") таким образом

0 голосов
/ 10 ноября 2011

Если вы не особенно заинтересованы в самом разделителе, вы можете использовать это

    String source = "aa^bb<cc>dd:ee\"ff/gg\\hh|ii?jj*kk:ll/mm..mn";
    String regex = "[<>:\"/\\\\|?*^]+|[.]{2}";
    String[] splits = source.split(regex);
    System.out.println(Arrays.toString(splits));

выход

[aa, bb, cc, dd, ee, ff, gg, hh, ii, jj, kk, ll, mm, mn]
0 голосов
/ 10 ноября 2011

Если Java может делать косвенные утверждения, один из способов таков:

(?:(?!\.\.)[^<>:"/|?*])+ непроверенный

правка , приведенное выше будет соответствовать до первого ..
Не совсем понятно, что вы пытаетесь сделать, но чтобы проверить всю строку в этих условиях, просто добавьте ^$ -
^(?:(?!\.\.)[^<>:"/|?*])+$ непроверенный

0 голосов
/ 10 ноября 2011

Хорошо. Я немного поиграл, и это предотвратит совпадение, если присутствует строка ..:

^(?:(?!(\.\.)).)*$

Я собираюсь продолжить, но вы можете просто запустить два отдельных регулярных выражения и убедиться, что ни одно из них не совпадает.

0 голосов
/ 10 ноября 2011

Не эксперт по Java, но, похоже, у вас определен класс отрицательных символов. Класс символов - это, по сути, список символов в этом классе или, в вашем случае, не в этом классе, и вы можете применить это к строке.

Кажется, что вы, скорее всего, после совпадения для строки "..". Если это так, я думаю, что вам просто нужно определенное регулярное выражение для этого. Может быть, это поможет:

\.\.

Точка "." само по себе, конечно, соответствует любому отдельному символу, поэтому экранирование от обратной косой черты необходимо для соответствия реальной строке из двух точек вместо любых двух символов.

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