2010-08-05 43 views
1
price:(?:(?:\d+)?(?:\.)?\d+|min)-?(?:(?:\d+)?(?:\.)?\d+|max)? 

此正則表達式正確地匹配以下示例。如何在Regex中繼續匹配

price:1.00-342 
price:.1-23 
price:4 
price:min-900.00 
price:.10-.50 
price:45-100 
price:453.23-231231 
price:min-max 

現在我想改進它來匹配這些情況。

price:4.45-8.00;10.45-14.50 
price:1.00-max;3-12;23.34-12.19 
price:1.00-2.50;min-12;23.34-max 

目前比賽停在半結腸。我怎樣才能讓正則表達式在整個分號分隔符上重複?

最終解決方案:

price:(((\d*\.)?\d+|min)-?((\d*\.)?\d+|max)?;?)+ 
+1

我們需要更多的一些背景,以你*不*要匹配。正則表達式'^。* $'將匹配你給出的所有例子。但是,一般情況下,您可以添加';?',在「price:」之後的所有內容周圍創建一個非捕獲組,並添加'*' – Jay 2010-08-05 21:16:20

+0

您的正則表達式還匹配「price:minmax」和「price:1.2.3」 。這真的是你想要的嗎? – 2010-08-05 21:49:34

回答

1

添加一個可選;在最後,使整個模式匹配的一種或多種:

price:((?:(?:\d+)?(?:\.)?\d+|min)-?(?:(?:\d+)?(?:\.)?\d+|max)?;?)+

+0

正是我在找的,謝謝! – 2010-08-05 22:00:06

1

首先有一些問題,你的正則表達式:匹配表達(?:\d+)?(?:\.)?\d+的xx.yyy代替你可以使用這個(?:\d*\.)?\d+。這隻能以一種方式匹配,因此避免了不必要的回溯。

此外,您的正則表達式匹配price:minmaxprice:1.2.3之類的東西,我假定您不想匹配。

重複匹配的簡單方法是添加一個分號,然後逐字重複您的正則表達式。

你能做到這樣雖然避免寫出整個常規兩次:

price:(?:(?:(?:\d*\.)?\d+|min)(?:-(?:(?:\d*\.)?\d+|max))?(?:;|$))* 

看到它在行動上Rubular

+0

爲什麼他不能只說「或更多這些」? – zebediah49 2010-08-05 21:18:44

+0

@ zebediah49:因爲在「添加分隔符」的正則表達式中沒有語法,請再次執行同樣的操作。 :( – 2010-08-05 21:19:38

+1

'(?:(?: | $))+'? – Amber 2010-08-05 21:24:48

0
price:((?:(?:\d+)?(?:\.)?\d+|min)-?(?:(?:\d+)?(?:\.)?\d+|max)?;?)+ 

我不知道什麼是與所有的?的(我知道的語法,我只是不知道爲什麼你用這麼多),但應該爲你做它。

+0

只需注意:對於字符串'price:min-maxmax',它與'price:min-max'相匹配,這可能或不可能是OP想要的(他沒有指定) – 2010-08-05 21:24:07

1

(?:\d+)?是一回事\d*(?:\.)?可以只是\.?。簡化後,你的原始正則表達式是:

price:(?:\d*\.?\d+|min)(?:-(?:\d*\.?\d+|max))? 

你有兩種選擇。您可以執行price([:;]range)*其中範圍是您對匹配數字範圍的正則表達式,或者對標點符號更精確,但必須寫出範圍兩次,並執行price:range(;range)*

price([:;]range)*  -- shorter but allows first ':' to be ';' 
price:range(;range)* -- longer but gets colon vs semi-colon correct 

選擇這兩個正則表達式中的一個:

price[:;](?:\d*\.?\d+|min)(?:-(?:\d*\.?\d+|max))? 
price:(?:\d*\.?\d+|min)(?:-(?:\d*\.?\d+|max))?(?:(?:\d*\.?\d+|min)(?:-(?:\d*\.?\d+|max))?)*