2017-05-25 74 views
2

我用一個簡單的模式,我需要匹配的最大值3串或2至少可選非捕獲組正則表達式

掙扎它可以是:

banana-split.taste 

或者

banana.taste 

我想要的是在點之前和之後的一切。 但是,如果一個連字符發生點之前在字符串中存在,我想在

隨着我的例子連字符和點之間的字符串時,它會導致這樣的:

例1

match[1] = banana 
match[2] = split 
match[3] = taste 

例2

match[1] = banana 
match[2] = 
match[3] = taste 

我想什麼是使用正向前查找/落後,但我覺得我用很糟糕

(.+)(?<=\-)(.*?)?\.(.+)

有了這個,我能得到很好的第一個例子,而不是第二

+0

當你捕捉'banana.taste'你希望有'品嚐'在'比賽[2]'或'比賽[3]'?我在問你如何以編程方式處理匹配數組。這將決定最適合您的情況的正則表達式函數和模式。 – mickmackusa

+0

我正在處理它通過isseting $ match [2]。用@WiktorStribiżew方法,它進展順利! – Plotisateur

回答

2

使用否定的字符類和一個可選的組:

([^-]+)(?:-([^.]+))?\.(.+) 

regex demo

詳情

  • ([^-]+) - 第1組:一種或多種字符比-儘可能多
  • (?:-([^.]+))?其他 - 任選的組匹配1次或0的出現:
    • - - 連字符
    • ([^.]+) - 組2:除.以外的一個或多個字符儘可能多
  • \. - 點
  • (.+) - 比換行符字符以外的任何字符1+
+0

完美,工作!謝謝。 ([^ - ] +)\ - ?(。+)?。(。+)''我最初錯過的是'[^ - ]'部分! – Plotisateur

+1

是的,否定性格階層在這裏至關重要。但我也會堅持使用可選的非捕獲組,作爲處理可選子匹配的最佳實踐。 –

2

沒有什麼錯Wiktor的的答案;我對他的答案的質量非常重視。

純粹出於教育目的,我想解釋preg_match()不是從字符串中提取子串的唯一基於正則表達式的函數。考慮這一個班輪:

方法:

var_export(preg_split('/[-\.]/',$str)); 

輸入/輸出:

$str='banana-split.taste'; // ['banana','split','taste'] 
$str='banana.taste'; // ['banana','taste'] 

通知preg_split()如何不使用捕捉組(所以沒有空的捕捉組),不包括在其輸出中匹配(通常是無用的)fullstring。

我不知道你在使用過程中,但如果這簡化了過程,那麼我很高興,我插話說。

+0

哦很酷!不知道preg_split有這個力量;)。但對於我的情況,Wiktor的方法更適合。仍然投票給你!感謝名單。 – Plotisateur