2016-03-19 2 views
4

У меня есть строковый вывод очень длинного ряда названий фильмов и названий музыкальных альбомов.Как использовать регулярное выражение для вывода определенного набора строк java?

например. [(Pixel Quality) (Year of Release) MovieTitle.ext,...... Albumname-artistname.ext]

т.е. [(HD 1080p) (2015) Batman vs Superman.mov,........tearsinheavan-ericclapton.mp3,.......]

Я пытаюсь определить фильмы и музыку врозь с помощью регулярных выражений выражений. В фильме есть качество изображения, дата выпуска, название фильма и расширение, например (.mov, .flv ... и т. Д.), В то время как музыка имеет название альбома, а затем - и имя исполнителя с расширением, подобным (.mp3 ,. а .....).

Ожидаемый результат: (Pixel Quality) (Year of Release) MovieTitle.ext для фильма и Albumname-artistname.ext для музыки.

Я не слишком знаком с регулярным выражением. Я знаю только, как совместить отдельные символы или определенное слово. Однако я не могу показать полное качество пикселей, год выпуска и movietitle.ext. Только конкретные слова, которые я совпадал, или отдельные символы.

Метод, который я использовал, чтобы найти «категории».

public void FindPatterns() { 

     String patternFilms = ("REGEX PATTERN?"); 
     Pattern pattern = Pattern.compile(patternFilms); 

     for (String name : names) { 
      Matcher matcher = pattern.matcher(name); 

      while(matcher.find()){ 

       System.out.println(matcher.group()); 
      } 
     } 

    } 

UPDATE:

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

Just incase Я все время помещал шаблон в неположенное место, я помещал шаблон регулярного выражения в String pattern, а "REGEX PATTERN? - это просто местозаполнитель, где я спрашиваю, правильно ли это место для размещения шаблон.

+0

Почему вы не можете разделить строку через запятую ("")? – mks

+0

@mks это упражнение программирования Java для школы. Ограничение, которое мы имеем, это не использовать какие-либо методы из класса String. Я не смог найти хороших примеров, которые могли бы помочь мне, поэтому я попробовал спросить здесь ... это все еще не очень помогает. – LovesPie

ответ

0

Что касается Java-кода, ваш код должен извлекать каждую отдельную группу в качестве именованной или проиндексированной группы. Это (относительно) легкая часть. Прежде чем вы дойдете до этого момента, похоже, вам нужна помощь с вашим шаблоном, поэтому давайте посмотрим на это в первую очередь.

Создайте свое регулярное выражение по частям. Полезен инструмент, который позволяет быстро итеративно повторять регулярное выражение. Мне нравится https://regex101.com/.

Что вам нужно сделать, это выбрать «сопоставимые группы» из входной строки. Таким образом, вы хотите сопоставить все, что вы можете выбросить (например, запятые и круглые скобки), а также данные, которые вы хотите извлечь. Для данных, которые вы хотите извлечь, окружайте регулярное выражение для каждой из этих частей данных в круглых скобках, чтобы обозначить группу.

Ваши входные строки имеют много символов, которые имеют особое значение внутри регулярного выражения, например [ и (. Поэтому, если вы хотите явно их сопоставить, они должны быть «экранированы». Также имейте в виду, что когда вы переводите свое регулярное выражение в Java, символ \ сам по себе является escape-кодом для Java String, поэтому его также нужно сбежать с другим \. Так, например, регулярное выражение, соответствующее символу [, будет определено как \\[.

Таким образом, начать путем сопоставления всего входа:

^.*$ 

^ символов является «якорем», которые означают «начало ввода» и «конец ввода» соответственно. . просто соответствует любому символу, а * соответствует предыдущему токену (любой символ) 0, 1 и более раз (так все).

В regex 101 это выделит весь вход.

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

^\[.*\]$ 

Теперь давайте начнем разбивая отдельные компоненты. Первые два разграничены скобки, и помните, что мы должны бежать круглые скобки, так что позволяет матч (something) (something) something:

^\[\(.*\) \(.*\) .*\]$ 

Теперь снова весь вход должен быть выделен снова. Позволяет вытащить две части данных, которые мы только что определили, окружая их в скобках:

^\[\((.*)\) \((.*)\) .*\]$ 

Теперь вы должны увидеть матчи выделены и показано более на правой стороне. Теперь продолжаем создавать регулярное выражение, заменяя последнее .* более конкретными совпадениями.

Комментарий к этому ответу, если вы столкнулись с какой-либо конкретной проблемой!

0

Похоже, это круглые скобки, а затем разделенные запятой, так что-то вдоль линий^[((. )) ((.?)), (. ), (.)] $

^соответствует началу строки, а $ соответствует началу строки \ экранирует символы, имеющие специальное значение регулярного выражения, например [. Вам нужно [и (для соответствия литеральным скобкам и круглым скобкам). (...) отмечает группу, так что вы можете извлечь ее, когда получите совпадение. . * - это всего лишь ноль или более повторений любого символа. чтобы получить один или несколько повторений Кроме того, добавьте «*», где это необходимо, чтобы соответствовать пространства

пример, в Perl:...

echo "(hd)(2015) Avatar.ext, Douchebagson.ext" | perl -pe "s/^\((.*)\) *\((.*)\) *(.*) *, *(.*)$/\1,\2,\3,\4/g" 
hd,2015,Avatar.ext,Douchebagson.ext 

Что происходит подмена Мы подставляя входную строку с < 1-я часть>, < Вторая часть>, .... Результатом является формат csv, который может быть интерпретирован вашим выбранным языком, Excel или тем, что когда-либо было.

\((.*)\) соответствует всем в круглых скобках. Скобки не являются частью группы захвата, так как литеральные круглые скобки/(и /) находятся вне позиции захвата (. *). ^ и $ здесь не нужны, но их можно использовать для поиска совпадений только ближе к концу или ближе к началу.

+0

Для $ вы имеете в виду, что он соответствует концу строки? Кроме того, как мне это сделать в моем контексте? Потому что только символы меня как-то путают. – LovesPie

+0

Пример в Perl: echo "(hd) (2015) Avatar.ext, Douchebagson.ext" | perl -pe "s/^ \ ((. *) \) * \ ((. *) \) * (. *) *, * (. *) $/\ 1, \ 2, \ 3, \ 4/g " hd, 2015, Avatar.ext, Douchebagson.ext ^ и $ здесь не нужны, но могут быть использованы для \ (: (. *) \) * \ ((. *) \) * (. *) *, * (. *) $ –

+0

Извините, я не знаю, почему я этого не понимаю. Я немного поиграл, чтобы попытаться заставить его работать. Но я получаю флаги с синтаксической ошибкой, прося меня удалить токены, или я вообще не получаю вывода. – LovesPie

0

Примечание: Поскольку это школьное задание, я не собираюсь объяснять, что происходит, поэтому оставляя ваше воображение. Вы должны быть в состоянии объяснить это своему учителю.

Попробуйте следующий код:

String data = "(HD 1080p) (2015) Batman vs Superman.mov," + 
     "tearsinheavan-ericclapton.mp3," + 
     "(HD 1080p) (2015) Batman vs Superman.mov," + 
     "tearsinheavan-ericclapton.mp3,(HD 1080p) (2015) Batman vs Superman.mov," + 
     "tearsinheavan-ericclapton.mp3,"; 

String rxString = "(?ism)(?<movie>\\(.*?\\) \\(\\d{4}\\).*?\\." + 
     "\\w+(?=[,\n]))|(?<music>[^(,\n]*?\\-[^,]+)"; 

Pattern regex = Pattern.compile(rxString); 

Matcher regexMatcher = regex.matcher(data); 
while (regexMatcher.find()) { 
    String movie = regexMatcher.group("movie"); 
    String music = regexMatcher.group("music"); 

    if(movie!=null) { 
     System.out.printf("Movie:\t%s\n", movie); 
    } 

    if(music!=null) { 
     System.out.printf("Music:\t%s\n", music); 
    } 
} 

Он распечатай:

Movie: (HD 1080p) (2015) Batman vs Superman.mov 
Music: tearsinheavan-ericclapton.mp3 
Movie: (HD 1080p) (2015) Batman vs Superman.mov 
Music: tearsinheavan-ericclapton.mp3 
Movie: (HD 1080p) (2015) Batman vs Superman.mov 
Music: tearsinheavan-ericclapton.mp3 
+0

Я получаю сообщение об ошибке. '' '' '' '' '' '' '' От ArrayList , который был преобразован из ArrayList . Объект Media состоит из String и Image (JLabel и ImageIcon). Я попробую превратить ArrayList в String и посмотреть, исправляет ли это это. – LovesPie

+0

Ну, это отдельная проблема. Вы можете объединить ArrayList в строку. – Saleem

+0

Или повторите выше фрагмент для каждого элемента ArrayList. Есть плюсы и минусы, но как студент, вы должны оценить свои варианты. – Saleem