2013-08-04 55 views
-2

說,給定的字符串是abcwhateverdefwhatever34567whatever012如何匹配那些按順序排列的組,比如匹配abc, def, 34567,012如何匹配序列組?

正則表達式,我現在是(.)\1{2,},但它同樣是匹配,但沒有按順序

+1

你不能用正則表達式來做這件事。根據您使用的語言,您可以通過查看各個「char」的數字表示來做到這一點。 –

+0

我正在使用php .. –

+1

正則表達式不適用於此任務。 – invisal

回答

1

如果你還在尋找PHP代碼。

function getSequence($str) { 
    $prev = 0; $next = 0; $length = strlen($str); 

    $temp = ""; 
    for($i = 0; $i < $length; $i++) { 
     $next = ord($str[$i]); 
     if ($next == $prev + 1) { 
      $temp .= $str[$i]; 
     } else { 
      if (strlen($temp) > 1) $result[] = $temp; 
      $temp = $str[$i]; 
     } 
     $prev = $next; 
    } 

    if (strlen($temp) > 1) $result[] = $temp; 

    return $result; 
} 

$str = "abcwhateverdefwhatever34567whatever012"; 
print_r(getSequence($str)); 
1

下面是一個解決方案,用正則表達式解決問題。這不是很有效,但我不會推薦它。

from re import findall, X 

text = "abcwhateverdefwhatever34567whatever012" 

reg = r""" 
(?: 
(?:0(?=1))| 
(?:(?<=0)1)|(?:1(?=2))| 
(?:(?<=1)2)|(?:2(?=3))| 
(?:(?<=2)3)|(?:3(?=4))| 
(?:(?<=3)4)|(?:4(?=5))| 
(?:(?<=4)5)|(?:5(?=6))| 
(?:(?<=5)6)|(?:6(?=7))| 
(?:(?<=6)7)|(?:7(?=8))| 
(?:(?<=7)8)|(?:8(?=9))| 
(?:(?<=8)9)| 

(?:a(?=b))| 
(?:(?<=a)b)|(?:b(?=c))| 
(?:(?<=b)c)|(?:c(?=d))| 
(?:(?<=c)d)|(?:d(?=e))| 
(?:(?<=d)e)|(?:e(?=f))| 
(?:(?<=e)f) 
){1,} 
""" 

print findall(reg, text, X) 

結果是:

['abc', 'def', '34567', '012'] 

正如你可以看到我只加了數字和第6個字母在字母表。如何繼續應該是相當明顯的。