2013-03-18 124 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

相关问题