2016-02-05 77 views
0

這是我的正則表達式有三個捕捉組:第一個捕獲組匹配不同

(.*)([0-9])([A-X]).* 

但是我得到不同組別的比賽對於這兩個字符串:

的String1:

ERICB7LTMC_01 
1: [0,5] ERICB 
2: [5,6] 7 
3: [6,7] L 

String2:

OMXDIV7_6TS 
1: [0,8] OMXDIV7_ 
2: [8,9] 6 
3: [9,10] T 

我不確定爲什麼在string2中的group1匹配不是OMXDIV。如果有人能夠解釋這種匹配行爲,我會非常感激。

的regexplanet鏈接,這個測試:http://fiddle.re/vqayb6

謝謝!

+0

如果你需要得到最短的匹配到第一個捕獲組,你需要一個懶惰匹配' '並將'_'添加到'AX'範圍:'(。*?)([0-9])([A-X _])。*' –

+0

什麼是確切的要求? –

+0

你的正則表達式是一種點星湯:它將所有東西(。*)進行匹配,然後試圖滿足你的其他要求:一個數字和一個來自A-X的字符和其他所有東西(或者什麼都不)。對於第二個字符串,第一個表達式匹配所有內容,然後在返回時查找* first *數字(這是'6'),然後查找一個字符(這是'T') - 賓果,總體匹配成功了,沒有進一步的問題。像@WiktorStribiżew所說的那樣(使用一個懶惰的量詞)或者更具體。 – Jan

回答

0

這是因爲您需要一個數字後跟A-X([0-9])([A-X])之間的一個字母。由於_(OMXDIV7 _ 6TS)不在範圍A-X第一場比賽是OMXDIV7_

0

首先讓我們看看你的正則表達式規則的實際含義。

您正則表達式(.*)([0-9])([A-X]).*

說明

  1. (.*).wildcard元字符相匹配任何換行符以外的\n。您已使用*這是一個重複元字符匹配0many通常被稱爲greedy搜索。

  2. ([0-9]):將匹配一個數字從09

  3. ([A-X]):將匹配一個字符從AX

  4. .*:將匹配許多字符。

現在你的問題。

文本:OMXDIV7_6TS

由於1組正在尋找一切字符(.*)本身將整個字符串匹配OMXDIV7_6TS。但是,然後正則表達式引擎從最後開始到回溯並查找group2的匹配。

在這個過程中它回溯至_,因爲這是最後一個字符組1 配件,而不是在第2組(([0-9]))發現這僅僅是數字。

這就是爲什麼正則表達式匹配OMXDIV7_6TS作爲整個字符串的原因。而回溯達到OMXDIV7_並說_也是1組,但6適合於第2組,所以我會匹配組1到這裏。

Regex101 debugger是偉大的瞭解整個搜索。

+0

* [Regex101調試器](https://regex101.com/r/kA9pW2/1)非常適合理解整個搜索。*將是一個很好的評論,爲什麼重複regex101工作?相反,你可以投票選擇「這個正則表達式意味着什麼」。 –

+0

@WiktorStribiżew:我的目的不是複製regex101的工作,但顯然OP是一個正則表達式的新手,我解釋了回溯如何工作,並給出了一個指針,以更多地瞭解這個過程。 – 2016-02-05 13:13:26

0

由於@Thomas解決後,您regex正在尋找一些([0-9])隨後以任何的[A_X]一個角色,所以7_(後面跟一個特殊字符_7)這裏不是匹配項...

您可以使用下面的一個預期的行爲...

([A-Z]*).*([0-9])([A-X]).* 

即:

字符串-1:ERICB7LTMC_01

>>> re.findall('([A-Z]*).*([0-9])([A-X]).*', 'ERICB7LTMC_01') 
[('ERICB', '7', 'L')] 

字符串-2:(。*?)OMXDIV7_6TS

>>> re.findall('([A-Z]*).*([0-9])([A-X]).*', 'OMXDIV7_6TS') 
[('OMXDIV', '6', 'T')]