2012-04-23 48 views
2

我試圖讓下面的工作。所以我有括號內的字符串。字符串可以包含任何字符,因此我想要解析的字符串也可以包含括號。我認爲當前正則表達式也匹配最後一個應該與<〜「)」匹配的括號,因此解析失敗。我在這裏錯過了什麼?解析包含任何字符的字符串

private def parser: Parser[Any] = a ~ b ~ c ^^ { 
    <do stuff here> 
} 

private def a: Parser[String] = "\"[^\"]*\"".r | "[^(),>]*".r 

private def b: Parser[String] = opt("(" ~> ".*".r <~ ")") ^^ { 
    case Some(y) => y.trim 
    case None  => "" 
} 

private def c: Parser[String] = rep("[email protected]" ~> "[^>.]*".r) ^^ (new String(_).trim) 

這應該分析以下類型的字符串:

test0 
[email protected] 
"test2" 
"test3"[email protected] 
test4.. 
[email protected] 
"test6.."[email protected] 
"[email protected]"[email protected] 
test8(icl>uw) 
test9(icl>uw)[email protected] 
"test10..()[email protected]"(icl>uw)[email protected] 
test11(icl>uw(agt>uw2,obj>uw3),icl>uw4(agt>uw5)) 
test12(icl>uw1(agt>uw2,obj>uw3),icl>uw4)[email protected]@attr2 
test13(agt>thing,obj>role>effect) 

因此,「一」解析器解析字符串,直到開括號或@ ATTR部分。 「b」解析器解析可選圓括號內的字符。 「c」分析可選的。@ attrs。

目前,我得到一個包含所有測試串類似的錯誤括號部分:

11:07:44.662 [main] DEBUG - Parsed: test8() 
11:07:44.667 [main] ERROR - FAILURE parsing: test8(icl>uw) -- `)' expected but `i' found 

所以我假設分析器正確分析的第一部分,但未能當它看到括號部分。

+2

你需要擴大與(也許是)一個小**例如這個問題你**正在努力去做,那是不是在起作用,因爲目前形成的問題尚不清楚。 例如:得到字符串輸入時會發生什麼?(()'?發生了什麼?出錯?有什麼意外? – 2012-04-23 19:14:13

+0

讓示例更清楚一點。因此,本質上我想解析括號內的任何內容 – Kitanotori 2012-04-24 10:54:22

+0

正則語言(以及正則表達式)不能用於解析嵌套圓括號:它們表達不夠充分,需要使用另一種技術,使用遞歸或自動機或解析器生成器。 – esope 2012-05-23 23:00:27

回答

0

正確的解決方案解析嵌套結構是在以下方式使用遞歸,例如:

val parser= "regex".r 
@tailrec 
def extract(string:String,foundTokens:List[String]=List.empty):List[String]={ 
    parser.findFirstMatchIn(string) match { 
    case Some(parser(matchedValue)) => extract(matchedValue,matchedValue::foundedTokens) 
    case None=>foundTokens 
} 

其中基本上在每次調用該函數,你找到的令牌追加到結果的列表和你啓動比賽結果的功能。當你再也找不到時,你會返回找到的標記。

如果多個匹配可能每個subtoken裏面,那麼你應該尋找這樣一個過程:

def extract(string:String):Iterator[String]={ 
    parser.findAllIn(string).flatMap{ 
     item => extract(item) 
    } 
} 
相關問題