2013-06-21 115 views
1

我利用這個軟件,使用dk-brics-automaton獲得正則表達式的狀態數 。現在,例如我有這種類型的RE:正則表達式中的空格

^SEARCH\s+[^\n]{10} 

當我將它插入下面的字符串,編譯器說,無效的轉義序列

RegExp r = new RegExp("^SEARCH\s+[^\n]{10}", ALL); 

所有一定FLAG

當我在小s之前使用雙反斜線時,編譯器接受它爲 作爲字符串,因爲在這裏\ s意味着空間,但我很困惑,當我將使用 雙斜槓時,它會考慮只是反斜槓和「S」我的意思是空白。

現在,我有成千上萬的這樣的正則表達式,我想計算有限自動機 states.So,這是否意味着我必須在所有RE中手動添加反斜槓?

這裏就是他們解釋與此相關的一些鏈接,但我沒有得到它:

http://www.brics.dk/automaton/doc/index.html

請幫助我,如果任何人有這個軟件,或者過去的一些經驗你有任何想法來解決這個問題。

+0

爲什麼你不測試它,如果'\\ s'表示空白? – stema

回答

1

我又看過那個文檔。 「automaton」是一個java包,因此我認爲你必須像java正則表達式那樣對待它們。因此,只需在正則表達式中加倍反斜槓即可。

這裏的東西是,Java不知道「原始」字符串。所以你必須逃脫兩個的水平。評估轉義序列的第一個級別是字符串級別。

該字符串不知道轉義序列\s,即錯誤。 \n很好,字符串評估它並存儲兩個字符\(0x5C)和n(0x6E)字符0x0A

然後字符串被存儲並交給正則表達式構造函數。這裏發生了下一輪轉義序列評估。

所以,如果你想逃避正則表達式的水平,那麼你必須加倍反斜槓。字符串級別將評估\\\,所以正則表達式級別得到正確的轉義序列。

+0

我也認爲它應該是這樣,但我試過這段代碼,它返回false,這意味着沒有匹配 RegExp r = new RegExp(「ab \\ s」);自動機a = r.toAutomaton(); RunAutomaton ab = new RunAutomaton(a); System.out.println(ab.newMatcher(「ab」).find()); – Xara

+0

當我將RegExp作爲參數提供給它時​​,會發生另外一件奇怪的事情,那麼它將它作爲空白區域接受 – Xara

+0

你見過他們的[FAQ](http://www.brics.dk/automaton/faq.html)嗎?似乎他們的正則表達式對Java正則表達式沒有太大的作用。沒有太多的文檔,我找不到像'\ s'這樣的預定義類。也許他們不支持他們? – stema