#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");
}
}
}