2014-12-19 21 views
2

我有一個正則表達式,旨在匹配特定語法,n次,每次出現後都有一個管道(|),除了最後一次出現。目前,我的模式是沿着(pattern)\|{3}的路線,但是這不符合沒有尾隨管道的要求。無論如何,我可以完成這個沒有重複(pattern)?我能想到的最佳解決方案是(pattern)\|{2}(pattern)正則表達式:重複模式n次,最終重複的變化

有效實施例:

* | 401 | [2-10]

無效實施例:

* | 401 | [2-10] |

(pattern)值是無關的回答我的具體問題,但爲了完整起見,在這裏它是在其目前的形式:(?:(?:((\*)|(\[[\w+ ]\-[\w+ ]\])|(\d+)))\|){3}

編輯

這是正在內.NET消耗, JavaScript的。

+0

你能提供一個真實的例子嗎? – 2014-12-19 01:01:45

+0

同樣,我不認爲這對於實際問題來說是非常關鍵的,但是這將是一個有效輸入的例子:'[1-2] | * | 254' – 2014-12-19 01:03:03

+0

'我能想到的最好的解決方案是)\ | {2}(pattern)。「在我看來,這是最好的解決方案 - 您不必關心處理不匹配的模式和分隔符的數量。爲了防止重複,只需使用字符串連接來構建模式。 – nhahtdh 2014-12-19 02:17:34

回答

4

有一個簡單的解決方案,如果你匹配整個輸入字符串:

(?:pattern(?:\|(?!$)|$)){3} 

這意味着:符合模式依次爲:

  • 要麼\|(?!$):管道不是後面跟着字符串的尾部
  • $字符串的末尾

3次。


針對您的特殊模式,這將是:

^(?:(?:((\*)|(\[[\w+ ]\-[\w+ ]\])|(\d+)))(?:\|(?!$)|$)){3} 

我也爲前綴的圖案^,因爲如果你在整個輸入反正匹配此解決方案纔有效。

+0

但是這匹配有一個跟蹤'|' – 2014-12-19 01:08:10

+0

@AvinashRaj的好地方,謝謝。固定。 – 2014-12-19 01:10:21

+0

我使用這個解決方案,因爲它更容易理解。謝謝! – 2014-12-19 01:27:50