Регулярное выражение, совпадение подстроки между каналами

Я хочу извлечь / сопоставить подстроки / размеры в следующей строке "| XS | XL | S | M |» используя регулярное выражение. В данном конкретном случае XS, XL, S и M.

Я пробовал следующие регулярные выражения без успеха.

\|(\w+)\|

Матчи: XS, S

(?=.(\w+)) 

Матчи: XS, S, XL, L, S, MI '

 Patrickdev15 июн. 2013 г., 14:14
Я в замешательстве - чтосо вторым шаблоном? Можете ли вы привести несколько примеров того, что вы хотите сопоставить?

Ответы на вопрос(3)

Решение Вопроса

истребляют трубы, поэтому они не там для следующего матча.

Второй шаблон немного запутан, но вы говорите, что для каждого символа в строке берите все символы слова, которые следуют за ним, без использования их. Так что на первой трубе, котораяXSЗатем двигатель движется кX где ответS, Затем двигатель перешел наS где шаблон не 'т совпадают.

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

Если ваш язык поддерживает это (Вы нене говоря уже о том, какой движок регулярных выражений вы используете), этот шаблон будет работать:

(?<=\|)[^|]++(?=\|)
(?<=\|) утверждает, что за рисунком есть труба[^|]++ притяжательно соответствует всем не труба символов(?=\|) утверждает, что есть труба по шаблону

Вот тестовый пример в Java (игнорируйте\\есть только синтаксис Java):

public static void main(String[] args) throws Exception {
    final String test = "|XS|XL|S|M|";
    final Pattern pattern = Pattern.compile("(?<=\\|)[^|]++(?=\\|)");
    final Matcher matcher = pattern.matcher(test);
    while(matcher.find()) {
        System.out.println(matcher.group());
    }
}

Выход:

XS
XL
S
M
 user63454515 июн. 2013 г., 14:32
спасибо за подробный ответ
 Dwarrior26 мар. 2019 г., 22:42
Можно ли сделать третье утверждение необязательным. Итак, если у меня есть эти строки -abc|def|gh, pq|ref and stu...I need result as def, ref and no result соответственно. Спасибо!

(?<=\|).*?(?=\|)

Чтобы разбить строку, используйте трубу в качестве разделителя после обрезки ведущих / задних труб.

В Java, чтобы сделать это в одну строку:

String[] sizes = str.replaceAll("(^\\|)|(\\|$)", "").split("\\|");

([^|]+), Это означает все, кроме труб.

 Boris the Spider15 июн. 2013 г., 14:30
Нет необходимости экранировать трубу в классе персонажей.
 Nicolas Lalevée16 июн. 2013 г., 01:10
действительно, спасибо. Ответ отредактирован.

Ваш ответ на вопрос