2013-05-17 64 views
0

我想爲這個BNF語法寫一個preg_match函數。Preg_match不允許字母和給定正則表達式允許0-3的數字

EXP ::= EXP + TERM | EXP - TERM | TERM 

TERM ::= TERM * FACTOR | TERM/FACTOR | FACTOR 

FACTOR ::= (EXP) | DIGIT 

DIGIT ::= 0 | 1 | 2 | 3 

我不想讓任何字母和數字的任何> 3和字符串應該用$ sign.I結束嘗試了這些模式,但它不能正常工作。我不明白我犯了什麼錯誤。

$pattern = "|[0-3\+\-()*/]+\\$$|"; 

$pattern = "|[^A-Za-z][0-3\+\-()*/]+\\$$|"; 

被修改:

試過這也

$圖案= 「|^[0-3 + - ()* /] + \ $$ |」;

但這允許 + 1 $,我不想允許任何數字> 3。

請問有人可以幫助我嗎?

謝謝。

+0

'\\ $$'將會被翻譯出來。是一個字面反斜槓,一個$,然後是一個字符串結尾的錨?也許你只需要'\ $$'來獲得一個字面值$和一個字符串尾部的錨點。 –

+0

@MarcB:他必須經歷這個醜陋,導致該模式的雙引號。 '\ $$'會給他兩個字符串的結尾。 (提示@user:不要雙引號RE,它會讓事情變得更加痛苦。) – cHao

+0

啊是的。真的夠了。 –

回答

1

如果您試圖驗證表達式,那麼您必須做的不僅僅是確保只允許允許的字符。至於數字?他們在那裏,因爲[0-3]+匹配至少一個數字,但如果需要也可以匹配數十個數字。

僅供參考,BNF描述的語言並不經常。一個純正則表達式無法對它做任何事情。 (它必須能夠跟蹤括號內有多少級別,例如......和有限狀態自動機(如RE)不能計數)。

幸運的是,PCRE不僅僅是常規正則表達式。 :)至少在PHP中,它們允許遞歸,這對於匹配嵌套圓括號等是絕對必要的。

$pattern = ':^(([0-3]|\((?1)\))([+*/-](?1))?)\$$:'; 

(?1)是一個遞歸參考,到所述第一子模式 - 實際模式,它不匹配的文本。這就像在那裏粘貼模式本身,除非你很難剪切和粘貼無限。 :P在這種情況下,它指的是([0-3]|\((?1)\))([+*/-](?1))?

除此之外,我使用的是簡化的語法(減去操作的順序,因爲你不會是能夠真正解析這與正則表達式反正)。

DIGIT : [0-3] 
OPER : [+*/-] 
LPAREN : '(' 
RPAREN : ')' 

EXP  : (DIGIT | LPAREN EXP RPAREN) (OPER EXP)? 
PATTERN : EXP '$' 

(?1)在實際模式中幾乎完全符合EXP。

+0

非常感謝... – user2342605

相關問題