2010-08-23 63 views
6

我有點兒是正則表達式的新手,所以會對這一點的同行反饋表示讚賞。它會在我的網站上大量使用,所以任何奇怪的邊緣情況都可能造成嚴重破壞。這個想法是在整個單位或分數中輸入一定量的配料。由於我的自動完成機制,只有一個數字也是有效的(因爲它會彈出一個下拉菜單)。這些線是有效的:任何方式來改善這個正則表達式?

1 
1/2 
1 1/2 
4 cups 
4 1/2 cups 
10 3/4 cups sliced 

該行的數字部分應該是其自己的組,所以我可以解析與我的分數解析器。數字部分之後的所有內容都應該是第二組。起初,我嘗試這樣做:

^\s*(\d+|\d+\/\d+|\d+\s*\d+\/\d+)\s*(.*)$ 

這幾乎工作,但 「1個1/2杯具」 將得到解析:(1)(1/2杯),而不是(1 1/2)和(杯)。我撓了一下腦後,我確定這是因爲我的「OR」子句的順序。 (1)滿足\ d +並且(。*)滿足其餘。所以我改變了這個:

^\s*(\d+\/\d+|\d+\s*\d+\/\d+|\d+)\s*([a-z].*)$ 

這幾乎可以工作,但允許奇怪,如「1 1/2/4杯」或「1/2 3杯」。所以,我決定一個有效的數值表達式後執行一個字母作爲第一個字符:

^\s*(\d+\/\d+|\d+\s*\d+\/\d+|\d+)\s*($|[a-z].*)$ 

注意,我在不區分大小寫的模式下運行這一點。這裏是我的問題:

  1. 表達式可以改進嗎?我有點不喜歡數字,分數,複合分數的「OR」列表,但我想不出一種允許整數,分數或複合分數的方法。

  2. 如果我可以在數字組件之後爲每個單詞返回一個組,那將會非常好。如(10 3/4)組,(杯子組)和(切片組)組。之後可以有任何數量的單詞。這可能嗎?

謝謝!

+0

哦,糟糕,錯過了一個例子..金額可以用十進制表示。所以我又添加了一個OR子句:012 \ \ \ \ \ \ \ \ \ \ ($ | [az]。*)$ – 2010-08-23 01:13:08

回答

3

好吧,在我看來,你根本不需要OR條件(但見下文)。

對於數字位,你可以逃脫:

\d+(\s+\d+/\d+) 

這將處理所有的分數值。

我仍然保持你的十進制與OR子句分開,因爲它可能會使事情變得複雜。所以,我認爲你很可能喜歡的東西逃脫:

^\s*((\d+\s)?(\d+/\d+)?|\d+(\.\d+)?)\s*([a-z].*)?$ 
| |     |   | | 
| |     |   | +--- start of alpha section. 
| |     |   +------ optional white space. 
| |     +------------------ decimal (nn[.nn]) 
| +------------------------------------- fractional ([nn ][nn/nn]) 
+----------------------------------------- optional starting space. 

雖然允許一個空閒的部分金額,所以你可能是你已經有了(整體,分數和小數中分離或條款)更好。

我喜歡([a-z].*)?$結構來($|[a-z].*)$自己,但可能只是我的過去討厭在我的RE多行結束標記:-)


但是,實話實說,我想你可能試圖在這裏用熱核彈頭擊打蒼蠅。

您是否確實需要限制輸入內容。我見過要求a pinch of salta handful of sultanas的食譜。我個人認爲你可能會限制你允許的內容。我會有一個自由形式的數量領域和一個食物類型的下拉菜單(實際上,除非我提供基於冰箱中的內容搜索食譜的能力,否則我可能只允許自由格式的食物)。

+0

也許我們正在使用不同的解析器,但是這與我上面的任何示例都不匹配。但是我想我會看到你想用問號做什麼。 – 2010-08-23 01:30:07

+0

@Mike,我不喜歡使用Javascript RE引擎,但我希望這些描述性內容能讓我更好地理解這個想法。 – paxdiablo 2010-08-23 01:36:51

+0

是的,看着你的表情我認爲它應該可以工作,但由於某種原因,它不:)我使用RegExTester.com來測試事情。 – 2010-08-23 01:41:20

1

我認爲,這正則表達式應該做你想要什麼:

/^\s*(\d+ \d+\/\d+|\d+\/\d+|\d+)\s*(.*)/ 

匹配特定的話,你應該只是做空格分割解析之後。有一件事你不想用正則表達式;)

+0

是的工作,只有沒有十進制支持..和我改變(。*)爲([az]。*)擺脫像1/2/cups .. – 2010-08-23 01:36:40

+0

其實可能($ | [az]。* )更好,因爲我不想在數字部分之後要求任何東西。 – 2010-08-23 01:38:05

+0

啊是的。如果你想要小於''\ d。] +'應該用'代替。如果您想添加複雜的規則,很難將其完全保存在一個正則表達式中。 – Wolph 2010-08-23 01:45:34

相關問題