簡體   English   中英

有什么辦法可以改善這個正則表達式

[英]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].*)$

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

  1. 表達能改善嗎? 我有點不喜歡數字,分數,化合物分數的“OR”列表,但我想不出允許整數,分數或復合分數的方法。

  2. 如果我可以在數字組件之后為每個單詞返回一個組,這將是特別好的。 例如(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 salta handful of sultanas 我個人認為你可能會限制你允許的內容。 我會有一個自由形式的數量字段和一個下拉菜單的食物類型(實際上我可能只允許自由形式的批次,除非我提供根據冰箱里的東西搜索食譜的能力)。

我相信這個正則表達式應該做你想要的:

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

為了匹配特定的單詞,您應該在解析后在空格上進行拆分。 有些事情你不想用正則表達式做;)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM