簡體   English   中英

如何用Java中的關鍵字 - 值對和{}以及換行符解析文件?

[英]how to parse a file with keyword-value pairs and {} and line breaks in Java?

在一個文件中,我有一些變量存儲如下:

author = {Some Author},
link = {some link},
text = { bla bla bla bla bla bla bla bla bla bla bla
bla bla bla bla bla bla bla bla bla bla bla bla bla},
...

一些變量在多行上。

之后我需要將每個String條目吐入鍵和值,但這不是問題。我到目前為止:

\\S+\\s*[=][{]\\s*\\S*[},]

對我來說工作正常的解決方案是:

(\w+)\s*=\s*\{(.*?)\}

\\S+\\s*[=]\\s*[{].*[},]

你的文章並不明顯,但這看起來像一個bibtex文件。 如果是,則大括號可以在大括號內出現,這意味着您的語言不是“常規”,並且不能通過正則表達式(例如您提供的語言)來描述。

如果沒有,那么你想要的東西

(\w+)\s*=\s*\{(.*?)\}

但編寫解析器可能是解決問題最可敬的方法。 如果它是bibtex你正在解析,一個開源Java書目管理器(如Jabref)可能會給你一些關於構建更健壯的東西的想法。

我建議您不要使用正則表達式,因為看起來您的格式有點過於自由形式。 編寫一個簡單的解析器,首先讀取一個字符串直到=作為一個鍵然后讀取括號的內部直到分隔逗號或文件結尾而不關心換行符對我來說,似乎是一種更簡單的方法。 如果你需要它,你可以隨時用空格替換換行符。 它還有一個好處,如果您的值可以包含大括號,適當地轉義,使用實際解析器處理它們比使用正則表達式更簡單。

這種格式看起來很簡單,並且不太可能擴展,因為手寫的解析器非常適合。 但是對於更復雜的語言,或者即使您只是想要練習,您也可以使用解析器生成器來構建解析器,這樣可以獲得更易於理解的語言定義。 我知道ANTLR是一種在Java中使用的流行的。

您可以使用String類的split方法。

public String[] split(String regex)

將此字符串拆分為給定正則表達式的匹配項。

您可以先用逗號分割輸入,然后在{}之間用空格分隔文本( \\s )。

你考慮過Java屬性文件嗎? http://en.wikipedia.org/wiki/.properties

你應該使用屬性 ,正則表達式不是你的情況下的好解決方案。

使用不同的文件格式可能會讓您感到頭痛,但您可以解析它:

Pattern p = Pattern.compile("\\s*(\\w+)\\s*=\\s*\\{(.*?)\\},?\\s*", Pattern.DOTALL);
while (true) {
    Matcher m = p.matcher(input);
    if (!m.find()) break;
    String key = m.group(1);
    String val = m.group(2);
    System.out.println("OK: key=" + key + ", val=" + val);
    input = m.replaceFirst("");
}

只需將println插入Map中即可。

我不確定你問的是什么,你的正則表達式在提供額外信息方面沒什么幫助。

但是,如果括號無法嵌套而您不想處理轉義括號,則正則表達式非常簡單。

注意:即使你最近的正則表達式(可能應該剛剛編輯你的帖子而不是回應你自己: \\\\S+\\\\s*[=]\\\\s*[{].*[},]正在做一些事情它沒有不需要這樣做肯定會讓你感到困惑。過度使用[]風格的角色類可能讓你感到困惑。你的最后一個[},]真的是說“字符匹配'}'或','”這就是我我很肯定不是你的意思。

正則表達式似乎是每個人最喜歡的鞭打男孩,但我認為這是合適的。

Pattern p = Pattern.compile( "\\s*([^={}]+)\\s*=\\s*{([^}]+)},?" );
Matcher m = p.matcher( someString );
while( m.find() ) {
    System.out.println( "name:" + m.group(1) + " value:" + m.group(2) );
}

正則表達式分解為:

  • 任何前面的空格。
  • 第一個捕獲組是一個非零長度的字符串,僅包含非'=','{'或'}'的字符
  • 任何中間空格。
  • '='
  • 任何中間空格。
  • '{'
  • 第二個捕獲組是一個非零長度的字符串,僅包含不是結束的字符'}'
  • '}'
  • 可選的 ','

這個正則表達式應該比。*版本更有效地執行,因為它更容易找出停止的位置。 我也認為它更清楚,但我會說話正則表達式。 :)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM