Регулярное выражение для разделения первого из «/token1/token2/token3»

#java #regex #guava

Вопрос:

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

Ввод: /token1/token2/token3

Требуемая производительность: /token1

Я пытался:

 List<String> connectorPath = Splitter.on("^[/\w ] ")
                    .trimResults()
                    .splitToList(actionPath);
 

У меня не получается, есть какие-нибудь идеи?

Комментарии:

1. Почему бы просто не сопоставить ^/\w , а не разделить?

2. Да, класс разделителя Гуавы.

Ответ №1:

Вместо разделения вы можете сопоставить

 ^/\w 
 

Или, если строка состоит из 3 частей, используйте группу захвата для первой части.

 ^(/\w )/\w /\w $
 

Пример Java

 Pattern pattern = Pattern.compile("^/\w ");
Matcher matcher = pattern.matcher("/token1/token2/token3");

if (matcher.find()) {
    System.out.println(matcher.group(0));
}
 

Выход

 /token1
 

Ответ №2:

Вы можете разделить на / то, чего нет в строке, начните использовать (?!^)/ регулярное выражение:

 String[] res = "/token1/token2/token3".split("(?!^)/");
System.out.println(res[0]); // => /token1
 

Смотрите демонстрационную версию кода Java и демонстрационную версию регулярных выражений.

  • (?!^) — отрицательный внешний вид, соответствующий местоположению, не находящемуся в начале строки
  • / / шар.

Использование Гуавы:

 Splitter splitter = Splitter.onPattern("(?!^)/").trimResults();
Iterable<String> iterable = splitter.split(actionPath);
String first = Iterables.getFirst(iterable, "");
 

Комментарии:

1. @Швальб Splitter.onPattern("(?!^)/").omitEmptyStrings().splitToList(actionPath) ?

2. как насчет того, чтобы я хотел, чтобы результат выглядел так: ["/token1","/token2", "/token3", ..] . используя разделитель Гуавы.

3. @Shvalb Для этого вы можете использовать (?!^)(?=/) регулярное выражение.

4. ибо "token1/token2" это дает ["token1", "/token2"] . Я бы ожидал , что это сработает ["/token2"] , как вы думаете?

5. @Швалб Хитрый. Попробуй "(?:^[^/] )?(?!^)(?=/)" . На самом деле, поскольку пустые предметы удаляются, используйте "(?:^[^/] )?(?=/)" .

Ответ №3:

Вы слишком все усложняете.

Попробуйте выполнить следующее регулярное выражение: ^(/w )(. )$

 import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class PathSplitter {
   public static void main(String args[]) {
      String input = "/token1/token2/token3";
      Pattern pattern = Pattern.compile("^(\/\w )(. )$");
      Matcher matcher = pattern.matcher(input);
      if (matcher.find()) {
         System.out.println(matcher.group(1)); //  /token1
         System.out.println(matcher.group(2)); //  /token2/token3
      } else {
         System.out.println("NO MATCH");
      }
   }
}