2014-09-23 69 views
0

我正在製作一個打印系統,並且在某個特定時刻,我需要使用遞歸正則表達式來驗證輸入的onkeypress,以便只有匹配該正則表達式時才能接受它。但這是一個遞歸表達!用於驗證範圍的遞歸正則表達式

一些有效的數據:

[0]: "1-9" 
[1]: "1" 
[2]: "1-9,1" 
[3]: "1,1-9,2,1-8" 

這將是非常容易EBNF:

validation = (number) | (number, '-', number), ',', validation ; 
number = digit, { digit } ; 
digit = 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 ; 

但正則表達式不遵循同樣的方法,因爲EBNF一樣。我讀過遞歸正則表達式,但我仍然對它們感到困惑。我現在的非遞歸的嘗試,即驗證每個逗號分裂有效值的1/1:

/([0-9]*)|(([0-9]*)-([0-9]*))/g 

這樣我可以單獨驗證每一個條目,但我想出一個辦法來驗證所有內容。

臨時的解決方案是:

pattern = /([0-9]*)|(([0-9]*)-([0-9]*))/g 
fields = fieldValues.split(',') 

而我創建包含真或假知道如果表達式匹配的陣列。我無法在正則表達式中完成所有工作,沒有JavaScript?

+0

這個正則表達式根本不是遞歸的。 – Unihedron 2014-09-23 13:13:50

+0

您的預期產出是多少? – ohaal 2014-09-23 13:14:03

+0

輸出應該只是一個布爾值。 TRUE ||假。 – 2014-09-23 13:14:35

回答

3

我想你想這樣的事情,

> /^\d+(?:-\d+)?(,\d+(?:-\d+)?)*$/.test("1-9,1"); 
true 
> /^\d+(?:-\d+)?(,\d+(?:-\d+)?)*$/.test("1-9,1,"); 
false 
> /^\d+(?:-\d+)?(,\d+(?:-\d+)?)*$/.test("1-9,1-1"); 
true 
2

使用正則表達式:

/^\d+(?:(?:-\d+(?:,\d+)?)*|(?:,\d+(?:-\d+)?)*)$/ 

這裏有一個解釋:

  • ^$斷言開始,比賽結束。
  • (?:)組具有|交替,以匹配或者:
  • \d+(可選-\d+可選,\d+)一次或多次,或;
  • \d+(可選,\d+可選-\d+)一次或多次。

這是regex demo

1

怎麼樣?

([0-9]+|([0-9]+-[0-9]+))(,([0-9]+|([0-9]+-[0-9]+)))* 

或者與\ d字符類速記符號:

(\d+|(\d+-\d+))(,(\d+|(\d+-\d+)))* 

說明:

這是基本圖案

(\d+|(\d+-\d+)) 

任選地接着(零或更多次)按字符「,」和相同的模式,再次。因此:

(,(\d+|(\d+-\d+)))*