我想使用最小可能的代码(字符数)来检查两个相同长度的单词是否相差一个字符。我有一个逻辑,我使用for循环遍历单词中的每个单词,并检查整个集合是否只有一个字符不同......但这似乎是一段长长的代码...perl中的正则表达式匹配
有人可以建议一些正则表达式,可以用它来以更紧凑的方式吗?
我想使用最小可能的代码(字符数)来检查两个相同长度的单词是否相差一个字符。我有一个逻辑,我使用for循环遍历单词中的每个单词,并检查整个集合是否只有一个字符不同......但这似乎是一段长长的代码...perl中的正则表达式匹配
有人可以建议一些正则表达式,可以用它来以更紧凑的方式吗?
可以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;
感谢您给予最大的一个字符表达式......但是,您能解释一下您在做什么吗?我有正则表达式的基本想法,但我无法理解表达式... – RoyOneMillion
这个正则表达式:/^(.*)(.)(.*)\1.\3$/ fits“bilboquetbilbaquet”like这个: /^(bilb)o(quet)(bilb)a(quet)$ / –
这个问题似乎是题外话,因为它是关于代码高尔夫的。这可能是http://codegolf.stackexchange.com上的主题 – devnull