如果模式是abba,如何匹配模式,并且将给出一个匹配模式的“redbluebluered”字符串

时间:2015-11-19 15:26:51

标签: regex string-matching

我昨天参加了校园驾驶的技术回合,并要求解决这个问题。我没有接近解决这个问题,我被拒绝了,现在我仍在努力解决这个问题,但无法解决。我想知道如何解决这个问题。面试官说没有测试字符串中的空格,也是一个字符串。

如果有输入字符串模式将abba。 然后匹配模式 1)catdogdogcat 2)redbluebluered 3)noyesyesno

并不匹配模式 1)catdogcat 2)redbluered 3)yesnoyes

(抱歉我的英语不好)

谢谢。

1 个答案:

答案 0 :(得分:3)

如果你需要一个不使用特定词语的通用解决方案,那么这可能是你所追求的:

(\w+)(\w+)\2\1

https://regex101.com/r/hP8lA3/1

效率不高但它会尝试贪婪地匹配两个单词组,然后使用backreferences确保首先跟随第二组,然后是第一组。

你可以使它更加通用,以匹配两组任何字符(除了换行符):(.+)(.+)\2\1

以下是使用C#的完整问题的一种可能解决方案:

private bool matcher(string pseudoPattern, string text) {
    string regexPattern = "^";
    var uniqueParts = new List<char>();

    foreach (char part in pseudoPattern.ToCharArray())
        if (uniqueParts.Contains(part)) {
            int backReference = uniqueParts.FindIndex(p => p == part) + 1;

            regexPattern += @"\" + backReference;
        }
        else {
            uniqueParts.Add(part);

            regexPattern += @"(\w+)";
        }

    regexPattern += "$";

    var regex = new Regex(regexPattern);

    return regex.Match(text).Success;
}