Вот простая чистая реализация, которая согласуется с Pattern#split
и работает с шаблонами переменной длины, которые выглядят не могут, и это проще в использовании. Это похоже на решение , предоставленное @cletus.
public static String[] split(CharSequence input, String pattern) {
return split(input, Pattern.compile(pattern));
}
public static String[] split(CharSequence input, Pattern pattern) {
Matcher matcher = pattern.matcher(input);
int start = 0;
List result = new ArrayList<>();
while (matcher.find()) {
result.add(input.subSequence(start, matcher.start()).toString());
result.add(matcher.group());
start = matcher.end();
}
if (start != input.length()) result.add(input.subSequence(start, input.length()).toString());
return result.toArray(new String[0]);
}
Я не делаю здесь нулевые проверки, Pattern#split
не делает, почему я должен. 't нравится if
в конце, но требуется для согласованности с Pattern#split
. В противном случае я бы безоговорочно добавлял, в результате чего в качестве последнего элемента результата была бы пустая строка, если строка ввода заканчивается шаблоном.
Я конвертирую в String [] для согласованности с Pattern#split
, я использую new String[0]
, а не new String[result.size()]
, см. здесь здесь .
Вот мои тесты:
@Test
public void splitsVariableLengthPattern() {
String[] result = Split.split("/foo/$bar/bas", "\\$\\w+");
Assert.assertArrayEquals(new String[] { "/foo/", "$bar", "/bas" }, result);
}
@Test
public void splitsEndingWithPattern() {
String[] result = Split.split("/foo/$bar", "\\$\\w+");
Assert.assertArrayEquals(new String[] { "/foo/", "$bar" }, result);
}
@Test
public void splitsStartingWithPattern() {
String[] result = Split.split("$foo/bar", "\\$\\w+");
Assert.assertArrayEquals(new String[] { "", "$foo", "/bar" }, result);
}
@Test
public void splitsNoMatchesPattern() {
String[] result = Split.split("/foo/bar", "\\$\\w+");
Assert.assertArrayEquals(new String[] { "/foo/bar" }, result);
}
Это потому, что, как говорится в сообщении, там нет свойства с именем properties
.
Способ получения пользовательских свойств зависит от того, как они были созданы. Существует два типа: Открытые расширения и Расширения схемы . Каждый из них хранится и ведет себя немного по-другому, поэтому вы можете обратиться к документации, на которую я ссылался, чтобы определить, какой тип вы хотите использовать.