正则表达面试

时间:2016-06-06 00:50:04

标签: java regex

正则表达式规则定义为

  1. ''匹配任何单个字符。
  2. '*'匹配零个或多个 前面的元素。
  3. 正则表达式匹配应覆盖整个输入字符串 例如

    1. isPaternPresent(“zz”,“z”)→false
    2. isPaternPresent(“zz”,“zz”)→true
    3. isPaternPresent(“zk”,“。*”)→true(此处图案为点星)
    4. 我无法理解eg.3。

      怎么可能是PaternPresent(“zk”,'。*')→是真的吗?

      以下是我的想法:

      1. z与'。'匹配。
      2. k匹配*,这是任何字符'。'表示。这里 '。'代表'z'
      3. 那怎么可以

          

        ZK

        匹配
          

        *

        是真的

3 个答案:

答案 0 :(得分:2)

尝试使用regex101.com

根据这个

  

。*匹配任何字符(换行符除外)量词:*在零之间   无限次,尽可能多次,根据需要回馈   [贪婪]

*正在重复不重复匹配的规则

答案 1 :(得分:1)

*是关联的!因此,*将在其之前采用任何表达式并应用seen zero or more times规则。在您的情况下,它会将规则应用于.,这意味着任何字符,零次或多次。'如果您有[01]*,则表示“0”或“1”,零次或多次“

答案 2 :(得分:0)

我在C#面试中被问到一个类似的问题(但对于单字符外卡,使用'?'而不是'。')。它困扰了我好几天,但我终于认为我发现了一些有用的东西。如果您发现任何错误,请随意转换为java,压力测试和评论。

public static bool IsPhraseValid(string regex, string phrase)
{
    if (regex.Length == 0 && phrase.Length == 0)
    {
        return true;
    }
    while(regex.Replace("**","*") != regex)
    {
        regex = regex.Replace("**", "*");
    }
    while (regex != phrase)
    {
        if (regex[0] == phrase[0] || regex[0] == '?')
        {
            if (regex.Length > 1 && phrase.Length > 1)
            {
                return IsPhraseValid(regex.Substring(1), phrase.Substring(1));
            }
            else
            {
                return regex.Length == phrase.Length;
            }
        }
        else if (regex[0] == '*')
        {
            if (regex.Length > 1)
            {
                for (int i = 0; i < phrase.Length; i++)
                {
                    if ((phrase[i] == regex[1] || regex[1] == '?') && IsPhraseValid(phrase.Substring(0,i) + regex.Substring(1), phrase))
                    {
                        return true;
                    }
                }
                return false;
            }
            else
            {
                return true;
            }
        }
        else
        {
            return false;
        }
    }
    return true;
}