/ / Java regex String parse, опитвайки се да измисли шаблон - java, regex

Java regex String parse, опитвайки се да разбере модел - java, regex

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 в такъв случай.