File file = new File("file-type-string-i-want-2000-01-01-01-01-01.conf.gz");
Matcher matcher = pattern.compile("\-(.*)\-\d{4}")).matcher(fileName);
StringBuilder sb = new StringBuilder();
while (matcher.find()) {
sb.append(matcher.group());
}
stringList = Arrays.asList(sb.toString().split("-"));
if (stringList.size() >= 2) {
nameFragment = stringList.get(stringList.size() - 2);
}
Желаният резултат е да се извлече
string-iwant
от струни, които изглеждат така
file-type-string-iwant-2000-01-01-01-01-01.conf.gz
За съжаление форматът на "string-iwant" е aнефиксирана дължина на буквено-цифрови символи, която ще включва само ЕДНЕН тире, но никога не започвайте с тире. Форматирането на датата е последователно, годината винаги е след низ, така че сегашният ми подход е да съвпадна на-годината, но имам проблеми с изключването на нещата в началото.
Благодаря за всякакви мисли или идеи
Редактиране: актуализирани низове
Отговори:
4 за отговор № 1Ето регексът, от който се нуждаете:
\-([^-]+\-[^-]+)\-\d{4}\-
По същество това означава:
-
започва с минус([^-]+\-[^-]+)
съдържа 1 или повече символи без минус, след това минус, след това 1 или повече символи, които не са минус. Тази част е заснета.-d{4}
знак минус и 4 цифри
Това обаче ще работи само ако stuff-you-need
има само един тире (или постоянно количество тирета, което ще се нуждае от корекция в регекс). В противен случай няма начин да разберете дали е даден низът file-type-string-i-want
думата type
принадлежи на ужилване, което искате или не.
Добавено:
В случай, че file-type
винаги съдържа точно един тире, можете да заснемете необходимата част по този начин:
[^-]+\-[^-]+\-(.*)\-\d{4}\-
Обяснение:
[^-]+-[^-]+\-
някакво количество нехифрени символи, след това тире, след това повече не-тирета. Това ще прескочиfile-type
низ със следния тире.-d{4}-
тире, 4 цифри, последвано от друг тире(.*)
всичко между предишните 2 оператора се заснема като низ, който трябва да изберете
0 за отговор № 2
Ако беше PHP, щях да използвам нещо като следното за улавяне на този низ.
/^(w+-){2}(?<string>.+?)-d{4}(-d{2}){5}(.w+){2}$/
0 за отговор № 3
Регексът, който бих използвал за тази цел, е това с положителен lookahead:
Pattern p = Pattern.compile("[^-]+-[^-]+(?=-\d{4})");
Което просто означава съвпадение на съдържащия текст точно един тире следван от една тире и четирицифрена година.
Тогава можете просто да вземете matcher.group(0)
като съвпадащ текст, който ще бъде string-iwant
в такъв случай.