2014-03-01 22 views
0

嗨,我已經達到了難以處理的正則表達式,其中我知之甚少。這將是巨大的,如果有人可以讓我瞭解如何interprete這樣的問題:複雜的正則表達式來處理數字序列

說明: 給定一串數字,如1234567我將不得不拿出一個正則表達式將輸出結果爲:

12 
23 
34 
45 
56 
67 

我不是要求一個直接的解決方案,而是一個指導方針會很好。

回答

1

在Perl中,您可以:

echo 1234567|perl -ne 's/(?<!^)(.)(?!$)/$1\n$1/g; print;' 

(?<!^)negative look-behind assertion(對於字符串^的開始)。 (?!$)是否定前瞻斷言(對於字符串$的結尾)。正則表達式將匹配除第一個和最後一個以外的所有字符。替代品在中間以換行符重複匹配的字符。

+0

這是非常整潔 - 沒想到重複的字符。 +1 –

0

正則表達式不會輸出任何東西,它會找到匹配的文本。我猜你的'輸出'實際上是所有比賽的列表。

所以你需要一個正則表達式,它可以在搜索文本中找到所有這些數字對。

1

你沒有說明你正在使用哪種語言,但我會認爲它支持積極的lookahead - 他們大多數人都會。

這裏是Java的解決方案:

public static void main(final String[] args) throws Exception { 
    final String in = "1234567"; 
    final Pattern patt = Pattern.compile("(?=(\\d{2}))."); 
    final Matcher matcher = patt.matcher(in); 
    while (matcher.find()) { 
     System.out.println(matcher.group(1)); 
    } 
} 

輸出:

12 
23 
34 
45 
56 
67 

模式是(?=(\d{2})).(你需要在Java中\\語言語法的原因)。

說明:

  • (?=(\d{2}))這是解決方案的肉,這是一個有點棘手,這是一個積極的預測先行斷言檢查輸入String當前點下面的兩個數字。然後它抓住這兩個數字 - 這是「輸出」的來源。
  • .這匹配任何字符(它也可能是\d但這不是必需的)。這確保了正則表達式引擎一次只能沿着一個空間移動。

所以最初引擎是String的開始。斷言捕獲12.捕獲並消耗1。現在引擎在1之後,斷言捕獲23並且.捕獲並且消耗2。等等...

它斷言是一次捕獲兩個字符,但模式是一次只推進一個字符的詭計。

這一個班輪做了更換,而不是搜索 - 在Java中String s爲不可變的如此的結果實際上是一個不同的String - 在String in沒有被操作修改:

public static void main(final String[] args) throws Exception { 
    System.out.println("1234567".replaceAll("(?=(\\d{2})).(?=\\d{2})", "$1\n")); 
} 

在這裏我們需要添加另一個斷言,在此之後至少還有兩個數字需要消耗。輸出:

12 
23 
34 
45 
56 
67 
1

這也將這樣做的Perl一個班輪:

echo 1234567 | perl -ne "$\=$/; print for $_=~/(?=(\d\d))/g"