Если есть какой-либо символ, который не содержит ни одной строки & mdash ;, скажем, \0
& mdash; Вы могли бы написать
"$first\0$second" =~ m/^(.*).*\0\1/s;
и самый длинный общий префикс будет сохранен как $1
.
Отредактировано, чтобы добавить: Это, очевидно, очень неэффективно. Я думаю, что если эффективность является проблемой, то это просто не тот подход, который мы должны использовать; но мы можем, по крайней мере, улучшить его, изменив .*
на [^\0]*
, чтобы предотвратить бесполезную жадность, которую просто придется вернуть назад, и добавив вторую [^\0]*
в (?>…)
, чтобы предотвратить возврат, который не может помочь. Это:
"$first\0$second" =~ m/^([^\0]*)(?>[^\0]*)\0\1/s;
Это даст тот же результат, но гораздо эффективнее. (Но все же не так просто , как эффективно, как простой подход, не основанный на регулярных выражениях. Если обе строки имеют длину n , я бы ожидал, что в худшем случае будет по крайней мере O ( n 2 ) времени, в то время как простой подход, не основанный на регулярных выражениях, занял бы O ( n ) времени в его худшем случае. )