2015-12-21 1 views
0

У меня есть текст, который имеет некоторый контент в формате уценки и состоит из двух частей первой части, которая окружена пунктирной линией, это метаданные, а оставшаяся часть после пунктирной линии - фактическое содержание.Как извлечь содержимое в пунктирной строке

Мой формат выглядит так:

--- 
toc: 
    customization: 
     title: Customization 
     themes: Themes 
     plugins: Plugins 
nav: 5 
--- 

summary: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque vel diam purus. 
body:Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque vel diam purus.` 

Я хочу, чтобы извлечь содержимое в этих пунктирных линий и есть магазин в отдельном HashMap (не хочу, чтобы хранить эти черточки в карте) и так же отдельный Hashmap для фактического контента.

Scanner scanner = new Scanner(new FileReader("src/main/webapp/WEB-INF/content/" + url + ".md")); 

HashMap<String, String> map = new HashMap<String, String>(); 

while (scanner.hasNextLine()) { 
    String[] columns = scanner.nextLine().split(":"); 

    for (int i = 0; i < columns.length; i++) { 
     if (!columns[i].isEmpty() && !columns[i].contains("---")) { 
      map.put(columns[0], columns[1]); 
     } 
    } 
} 

scanner.close(); 
System.out.println(map); 

Может кто-нибудь сказать мне, как я могу извлечь эти строки внутри тире и хранить его в отдельном HashMap и хранить фактическое содержание в отдельном HashMap?

+0

Someth как '--- (. *?) ---'? Или, может быть, '\ - {3} (. *?) \ - {3}' –

+0

мог бы, пожалуйста, привести мне небольшой пример? –

+0

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

ответ

3

Просто следить за какую карту использовать:

Map<String, String> regularMap = new HashMap<String, String>(); 
Map<String, String> separateMap = new HashMap<String, String>(); 

Map<String, String> currentMap = regularMap; 
boolean inDashes = false; 
while (scanner.hasNextLine()) { 
    String line = scanner.nextLine(); 
    if(line.equals("---")) { 
     // switch state 
     inDashes = !inDashes; 
     currentMap = inDashes ? separateMap : regularMap; 
    } else { 
     String[] columns = line.split(":"); 
     for (int i = 0; i < columns.length; i++) { 
      if (!columns[i].isEmpty()) { 
       currentMap.put(columns[0], columns[1]); 
      } 
     } 
    } 
} 
+0

Я получаю исключение ArrayOutOfBound 1 при запуске этого кода. и еще одна вещь в моем файле у меня нет ':' в содержании i, e ,. после пунктирной линии. как я могу разобрать в то время? –

0

Этот простой код должен работать нормально.

public static void parseFile(String url) throws FileNotFoundException { 
    Scanner scanner = new Scanner(new FileReader("src/main/webapp/WEB-INF/content/" + url + ".md")); 

    // create a two maps 
    HashMap<String, String> metaData = new HashMap(); 
    HashMap<String, String> content = new HashMap(); 

    // and a marker 
    boolean isMetaData = false; 

    while (scanner.hasNextLine()) { 
     String nextLine = scanner.nextLine(); 
     if ("---".equals(nextLine)) { // if line equals "---" then 
      isMetaData = !isMetaData; // switch a marker 
      continue; // and skip this line 
     } 

     // add to proper map the value from the line 
     addPropertyToMap(isMetaData ? metaData : content, nextLine.split(":")); 
    } 
    scanner.close(); 

    System.out.println(metaData); 
    System.out.println(content); 
} 

private static void addPropertyToMap(HashMap<String, String> map, String[] columns){ 
    if(columns.length == 1){ 
     // if your key don't have value, replace it with an empty string 
     map.put(columns[0].trim(), ""); 
    } else { 
     map.put(columns[0].trim(), columns[1].trim()); 
    } 
} 

При выполнении этого кода, вы должны получить следующий результат:

{themes=Themes, nav=5, customization=, plugins=Plugins, toc=, title=Customization} 
{summary=Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque vel diam purus., body=Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque vel diam purus.} 
+0

в случае, если у меня нет ':' в разделе содержимого, как я могу поместить это на карту? –

+0

У вас есть пример? Я не понимаю, что вы имеете в виду. –

+0

в случае, если файл в этом формате '--- ключ: значение Описание: некоторые описания реквизита: p1: value1 p2: значение2 Тема: по умолчанию Дата: 20-3-1202 --- это пункт это еще один пункт это еще один пункт это другой paragraph' –

0

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

Модель

public class Model { 

    // Fields 
    private String toc; 
    private String customization; 
    private String title; 
    private String themes; 
    private String plugins; 
    private int nav; 

    // No-arg Default Constructor 
    public Model() {}; 

    // Getters & Setters 
    public String getToc() { 
     return toc; 
    } 

    public void setToc(String toc) { 
     this.toc = toc; 
    } 

    public String getCustomization() { 
     return customization; 
    } 

    public void setCustomization(String customization) { 
     this.customization = customization; 
    } 

    public String getTitle() { 
     return title; 
    } 

    public void setTitle(String title) { 
     this.title = title; 
    } 

    public String getThemes() { 
     return themes; 
    } 

    public void setThemes(String themes) { 
     this.themes = themes; 
    } 

    public String getPlugins() { 
     return plugins; 
    } 

    public void setPlugins(String plugins) { 
     this.plugins = plugins; 
    } 

    public int getNav() { 
     return nav; 
    } 

    public void setNav(int nav) { 
     this.nav = nav; 
    } 
} 

Тестовый файл мД

import java.io.FileReader; 
import java.util.ArrayList; 
import java.util.Arrays; 
import java.util.List; 
import java.util.Scanner; 

public class Test { 

    private static final int OBJECT_LINE_LENGTH = 6; 

    public static void main(String[] args) throws Exception { 

     String url = "testFile"; 
     Scanner scanner = new Scanner(new FileReader("src/main/webapp/WEB-INF/content/" + url + ".md")); 
     boolean isInContent = false; 
     int lineCounter = 0; 
     String lines[] = new String[OBJECT_LINE_LENGTH]; 
     List<Model> objectList = new ArrayList<Model>(); 

     while (scanner.hasNextLine()) { 
      String line = scanner.nextLine(); 

      if(line.equals("---")) { 
       if(isInContent == false) { 
        isInContent = true; 
        continue; 
       } else { 
        isInContent = false; 
       } 
      } 

      if(!isInContent) { 
       continue; 
      } 

      lines[lineCounter++] = line; 

      if(lineCounter == 6) { 
       lineCounter = 0; 
       objectList.add(parseObject(lines)); 
      } 

     } 
     scanner.close(); 

     printObjectList(objectList); 
    } 


    private static Model parseObject(String lines[]) { 
     Model model = new Model(); 

     model.setToc(Arrays.copyOfRange(lines, 1, 4).toString()); 
     model.setCustomization(Arrays.copyOfRange(lines, 2, 4).toString()); 
     model.setTitle(lines[2].split(":")[1].trim()); 
     model.setThemes(lines[3].split(":")[1].trim()); 
     model.setPlugins(lines[4].split(":")[1].trim()); 
     model.setNav(Integer.parseInt(lines[5].split(":")[1].trim())); 

     return model; 
    } 

    private static void printObjectList(List<Model> objectList) { 
     for(Model m : objectList) { 
      System.out.println(); 
      System.out.println("Title : " + m.getTitle()); 
      System.out.println("Themes : " + m.getThemes()); 
      System.out.println("Plugins: " + m.getPlugins()); 
      System.out.println("Nav : " + m.getNav()); 
     } 
    } 

} 

Образец используется для испытания

--- 
toc: 
    customization: 
     title: Customization 
     themes: Themes 
     plugins: Plugins 
nav: 5 
--- 
--- 
toc: 
    customization: 
     title: anotherCustomization 
     themes: anotherThemes 
     plugins: anotherPlugins 
nav: 10 
--- 
--- 
toc: 
    customization: 
     title: ThirdCustomization 
     themes: ThirdTheme 
     plugins: ThirdPlugin 
nav: 15 
--- 




--- 
toc: 
    customization: 
     title: fourthCustomization 
     themes: fourthTheme 
     plugins: fourthPlugin 
nav: 20 
--- 

Test Output

Title : Customization 
Themes : Themes 
Plugins: Plugins 
Nav : 5 

Title : anotherCustomization 
Themes : anotherThemes 
Plugins: anotherPlugins 
Nav : 10 

Title : ThirdCustomization 
Themes : ThirdTheme 
Plugins: ThirdPlugin 
Nav : 15 

Title : fourthCustomization 
Themes : fourthTheme 
Plugins: fourthPlugin 
Nav : 20