[英]Any way to improve this regular expression?
我是正規表達的新手,所以會對這一點的同行反饋表示贊賞。 它將在我的網站上大量使用,因此任何奇怪的邊緣情況都可能完全造成嚴重破壞。 我們的想法是在整個單位或分數中輸入配方中一定量的成分。 由於我的自動完成機制,只有一個數字也是有效的(因為它會彈出一個下拉列表)。 這些行有效:
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].*)$
注意我在不區分大小寫的模式下運行它。 這是我的問題:
表達能改善嗎? 我有點不喜歡數字,分數,化合物分數的“OR”列表,但我想不出允許整數,分數或復合分數的方法。
如果我可以在數字組件之后為每個單詞返回一個組,這將是特別好的。 例如(10 3/4)組,(杯子)組和(切片)組。 之后可以有任意數量的單詞。 這可能嗎?
謝謝!
好吧,在我看來你根本不需要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.
雖然這允許空的小數量,所以你可能會更好地得到你已經得到的東西(在單獨的OR子句中的整數,小數和小數)。
我更喜歡([az].*)?$
構造到($|[az].*)$
我自己,但這可能只是對我過去在我的RE中有多個行結束標記的厭惡:-)
但是,老實說,我認為你可能會試圖用熱核彈頭拍打蒼蠅。
你真的需要限制輸入的內容嗎? 我看過食譜要求a pinch of salt
和a handful of sultanas
。 我個人認為你可能會限制你允許的內容。 我會有一個自由形式的數量字段和一個下拉菜單的食物類型(實際上我可能只允許自由形式的批次,除非我提供根據冰箱里的東西搜索食譜的能力)。
我相信這個正則表達式應該做你想要的:
/^\s*(\d+ \d+\/\d+|\d+\/\d+|\d+)\s*(.*)/
為了匹配特定的單詞,您應該在解析后在空格上進行拆分。 有些事情你不想用正則表達式做;)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.