2014-02-12 170 views
0

我想使用最小可能的代码(字符数)来检查两个相同长度的单词是否相差一个字符。我有一个逻辑,我使用for循环遍历单词中的每个单词,并检查整个集合是否只有一个字符不同......但这似乎是一段长长的代码...perl中的正则表达式匹配

有人可以建议一些正则表达式,可以用它来以更紧凑的方式吗?

+4

这个问题似乎是题外话,因为它是关于代码高尔夫的。这可能是http://codegolf.stackexchange.com上的主题 – devnull

回答

2

可以Concat的两个词,并使用此模式:

"bilboquetbilbaquet" =~ /^(.*)(.)(.*)\1(?!\2).\3$/ # exactly one character different 

"bilboquetbilbaquet" =~ /^(.*)(.)(.*)\1.\3$/ # one character max 

图案的详细资料:

^   # anchor for the start of the string 
(.*)  # capture group 1: zero or more characters 
(.)  # capture group 2: one character 
(.*)  # capture group 3: zero or more characters 
\1  # backreference to group 1 
(?!\2) # negative lookahead: not followed by group 2 content 
.   # one character 
\3  # backreference to group 3 
$   # anchor for the end of the string 

例如:

my $strA = "bilboquet"; 
my $strB = "bilbaquet"; 

my $result = ($strA.$strB) =~ /^(.*)(.)(.*)\1(?!\2).\3$/; 

print $result; 
+0

感谢您给予最大的一个字符表达式......但是,您能解释一下您在做什么吗?我有正则表达式的基本想法,但我无法理解表达式... – RoyOneMillion

+0

这个正则表达式:/^(.*)(.)(.*)\1.\3$/ fits“bilboquetbilbaquet”like这个: /^(bilb)o(quet)(bilb)a(quet)$ / –