2013-03-18 116 views
1

我有一個字符串,並且需要檢查它是否有一個字符序列。例如。 ABCDE,或者abcd如何使用正則表達式來識別順序字符?

比方說,我需要有長度大於3

換句話說更大的序列標誌串,我需要標誌abcpa,但不abpqx

我可以使用RegEx執行此操作嗎?

謝謝

+1

正則表達式是不是做這份工作的合適工具。 – Toto 2013-03-18 12:23:09

+0

「序列」是什麼意思?任何連續的字符序列,如「klm」,「hij」,我推測? – 2013-03-18 12:23:46

+0

請澄清問題。查找字符串的標準是什麼?你給出了3個例子,但它們之間沒有明顯的相關性。即使你提到的長度似乎並不適用,因爲你說你不想要「abpqx」。你在找什麼? – 2013-03-18 12:42:56

回答

1

該正則表達式匹配的序列與至少連續3個字符:

/(?:abc|bcd|cde|def|efg|fgh|ghi|hij|ijk|jkl|klm|lmn|mno|nop|opq|pqr|qrs|rst|stu|tuv|uvw|vwx|wxy|xyz)/i 

下面的Perl腳本檢查指定數量的連續字符序列:

#!/usr/bin/perl 
use strict; 
use warnings; 
my ($len, $test) = @ARGV; 
my $s = "abcdefghijklmnopqrstuvwxyz"; 
my $re = ""; 
for (0..length($s)-$len) { 
    $re .= substr($s, $_, $len)."|"; 
} 
chop $re; 
exit 1 unless ($test =~ m/(?:$re)/i); 

腳本退出,錯誤代碼1如果找不到匹配,並且其他錯誤代碼爲0。

稱之爲perl script.pl <min length of sequence> <string to test>

例子:

% perl script.pl 5 aaaabbbbeeeeehijklllmnppp && echo "match" || echo "no match" 
match 

% perl script.pl 6 aaaabbbbeeeeehijklllmnppp && echo "match" || echo "no match" 
no match 
+0

這工作,我猜,但它不是可擴展的嗎?明天,如果我需要檢查4個連續字符,則正則表達式匹配會更長......只是想知道是否有一個簡短而甜蜜的方法來檢查序列......但我猜並不是! :( – navinpai 2013-03-18 14:17:11

+0

@navinpai我添加了一個Perl腳本,可以處理這個。 – speakr 2013-03-18 14:49:00

0

我認爲你可以用正則表達式來做到這一點。我已經假設你正在尋找的序列必須從A開始。下面的例子在Powershell中有一個簡化正則表達式,只是爲了速度和清晰度而使用前8個字符,並且需要擴展:

$re = "(?<=(?<=(?<=(?<=(?<=(?<=a)b?)c?)d?)e?)f?)g?" 
"abcpa" -match $re 
$matches # => "abc" 
$matches[0].length # => 3 

沒有完全測試,但我認爲它是確定的。

+0

啊,但我已經在問題的評論中提到序列不需要以A開頭....無論如何,謝謝! :) – navinpai 2013-03-18 14:15:48

相關問題