2015-05-06 134 views
2

Scanario捕獲匹配組

我必須抓住從組成串子串的字符串。 匹配條件:

  • 字符串開始與「SECTION1:」

  • 捕獲串可以是一個空白分隔或字母數字值

  • 的破折號分開的列表中,如果所捕獲的字符串與結束特定後綴('-xx'),從捕獲的字符串中排除後綴。

實例

SECTION1:地老虎:部分1個匹配,搶 '地老虎'

SECTION1:地老虎ζ電:部分1個匹配,搶 '地老虎ζ電'

第1部分:ypsilon-zeta:第1部分匹配,抓住'ypsilon-zeta'

SECTION1:地老虎-XX:部分1個匹配,搶 '地老虎',排除 '-xx'

SECTION1:地老虎的ζ-XX:部分1個匹配,搶 '地老虎ζ電',排除'-xx'

SECTION1:地老虎-ζ電-XX:部分1個匹配,搶 '地老虎-ζ電',排除 '-xx'

第2節:地老虎:部分2不匹配

解決方案到目前爲止

^section1:([a-zA-Z0-9\- ]+)(\-xx)?$ 

的想法是讓第1組,而第2組是可選的。 Demo

問題

不幸的是,後綴1組定義相匹配,因爲它是一個字母串用破折號。所以得到的捕獲字符串不會排除後綴。

任何線索?

回答

3

你很近,你面臨的主要問題是操作員的貪婪。

n+將匹配儘可能多的n越好,如果我們希望減少這一點,我們有?

我結束了這個表達式Demo here

^section1:([a-zA-Z0-9\- ]+?)(|-xx)$ 

主要區別後綴這是?+使它非貪婪(或不情願),我更喜歡使用空和慾望後綴之間的交替,而不是組(|-xx)這個匹配什麼或-xx行結束之前。

我在兩者之間沒有任何爭論,我認爲品味的問題。

+2

很好完成:'(| -xx)' – dawg

2

-XX用途變更與非捕獲組,並使用?,使+不那麼願意說-xx在比賽吸入:

(?<=^section1):([a-zA-Z0-9\- ]+?)(?:-xx|:) 

Demo

如果沒有第二個:用作書籤,使用$

(?<=^section1):([a-zA-Z0-9\- ]+?)(?:-xx|\s*$) 

Demo 2

+0

值得說一句關於非貪婪算子,不是嗎? – Tensibai