【问题标题】:Java String Matching the Regex匹配正则表达式的 Java 字符串
【发布时间】:2014-12-13 10:53:44
【问题描述】:

我正在尝试解决以下问题。

给定一个字符串和一个正则表达式模式,给出该模式在字符串中出现的次数。正则表达式符号含义如下:

. - 2 occurrences of the previous character, 
+ - 4 occurrences of previous character, 
* – more than 5 occurrences of the previous character

给出的示例输入:

aaaaaannndnnnnnnfffhfhhgjjjwkkkllclc
a.
n+
a*
an.
a.d.

给出的示例输出:

5
3
1
1
0

我的方法是将所有正则表达式转换为正常模式。即,对于上面的示例,我的 RegEx 将是:

aa
nnnn
aaaaaa
ann
aadd

然后计算出现次数。但如果输入 RegEx 是,我不知道该怎么办:

a*d.

请注意,我不能使用任何内置函数,例如 Pattern.Matches。有什么建议吗?

谢谢。

【问题讨论】:

  • * 是未绑定的(任何大于 5 的数字),因此您实际上无法明确表示模式,因为 a* 是一个 infinite 有限字符串集.另外,随便重新定义+*的人应该知道,她很可能会引起很多混乱。
  • 您是否要创建新规则?
  • 如果您不能使用内置函数,那么将模式转换为“真正的”正则表达式模式有什么好处?你能不能用正则表达式来完成这个任务?
  • 如果给出这个规则,你将如何实现你的正则表达式匹配是问题? @Rawing 这是一个面试问题。你可以在这里查看。 geeksforgeeks.org/browserstack-written-test-3 我试图通过扩展正则表达式来解决这个问题。只是一种方法。

标签: java regex string


【解决方案1】:

这是一个方法示例,它可以解析您的模式并告诉您输入字符串是否以指定的模式开头。我没有完成它,因为我认为这是某种家庭作业:

boolean startsWithPattern(String pattern, String str) {
    int strPos = 0;
    int patternPos = 0;
    // parse pattern and check input str
    while (patternPos < pattern.length()) {
        char symbol = pattern.charAt(patternPos);
        // TODO this will not work for patterns like `a`, only for `a.`, `b*`, `n+`
        char action = pattern.charAt(patternPos + 1); 
        patternPos += 2;
        switch (action) {
            case '.':
                int end = strPos + 2; // check only two symbols
                for (; strPos < end; ++strPos) {
                    if (str.charAt(strPos) != symbol) {
                        return false; // string don't match
                    }
                }                    
                break;
            case '*':
                // TODO some cycle that would check 5+ positions in str
                break;
            case '+':
                // TODO similar to '.'
                break;
        }
    }
    return true; // string starts with pattern!
}

【讨论】:

  • 这不是作业问题。你可以在ideone.com/06CQSO 找到我的实现我相信你还没有解决我的问题。我被困在如何解决输入问题:a*d.
  • 您可以使用您当前的方法解决模式a*d. 的问题,但该解决方案将非常无效。为模式a*d. 生成所有“正常模式”似乎非常痛苦,而不是在长度为 100000 的字符串中搜索它们(例如)。
猜你喜欢
  • 2013-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-05
  • 2013-12-25
相关资源
最近更新 更多