嗨,我已經達到了難以處理的正則表達式,其中我知之甚少。這將是巨大的,如果有人可以讓我瞭解如何interprete這樣的問題:複雜的正則表達式來處理數字序列
說明: 給定一串數字,如1234567
我將不得不拿出一個正則表達式將輸出結果爲:
12
23
34
45
56
67
我不是要求一個直接的解決方案,而是一個指導方針會很好。
嗨,我已經達到了難以處理的正則表達式,其中我知之甚少。這將是巨大的,如果有人可以讓我瞭解如何interprete這樣的問題:複雜的正則表達式來處理數字序列
說明: 給定一串數字,如1234567
我將不得不拿出一個正則表達式將輸出結果爲:
12
23
34
45
56
67
我不是要求一個直接的解決方案,而是一個指導方針會很好。
在Perl中,您可以:
echo 1234567|perl -ne 's/(?<!^)(.)(?!$)/$1\n$1/g; print;'
(?<!^)
是negative look-behind assertion(對於字符串^
的開始)。 (?!$)
是否定前瞻斷言(對於字符串$
的結尾)。正則表達式將匹配除第一個和最後一個以外的所有字符。替代品在中間以換行符重複匹配的字符。
正則表達式不會輸出任何東西,它會找到匹配的文本。我猜你的'輸出'實際上是所有比賽的列表。
所以你需要一個正則表達式,它可以在搜索文本中找到所有這些數字對。
你沒有說明你正在使用哪種語言,但我會認爲它支持積極的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
這也將這樣做的Perl一個班輪:
echo 1234567 | perl -ne "$\=$/; print for $_=~/(?=(\d\d))/g"
這是非常整潔 - 沒想到重複的字符。 +1 –