繁体   English   中英

正则表达式到Java代码

[英]regex to java code

我想用Java编写正则表达式。 可能的字符串是:

yyyyyy$
<t>yy<\t>$
<t><t>yyyyy<\t><\t>$
<t><t>y<\t>y<\t><t>yyyyy<\t>yy$

不允许或不可能的字符串是:

<t><\t>$ (no “y” in the string)
<t>yy<t><\t>$ (one extra <t> ).

一些规范是:在任何正确的字符串中恰好有一个$,这始终是字符串中的最后一个符号。 $之前的字符串必须为非空,我们将其称为表达式。 表达式被递归定义为:

  • 字母“ y”
  • <t><\\t>括起来的表达式
  • 一系列表达。

我构建的正则表达式是: y+|y*(<t>y+(<t>y*<\\t>)*<\\t>)现在,我在Java中将此正则表达式编码为: "d+|(d*(<s>d+(<s>d*<\\\\s>)*<\\\\s>))$"代码:

private static void checkForPattern(String input) {
            Pattern p = Pattern.compile("  d+    |   (d*(<s>d+(<s>d*<\\s>)*<\\s>))     $");
            //Pattern p= Pattern.compile("d+|d*<s>dd<\\s>$");
            Matcher m = p.matcher(input);
            if (m.matches()) {
                System.out.println("Correct string");
            } else {
                System.out.println("Wrong string");
            }
        }

语法错误是什么,因为我在解析的每个String上都说“ wrong”。

我建议不要为此使用正则表达式,因为Java的正则表达式引擎无法像其他正则表达式引擎(即.NET)一样有效地平衡<t><\\t>出现的次数。 即使在这些引擎中执行此操作也相当复杂,并且可能有更好的方法来解决您的问题。 下面的代码就是这样做的:它计算<t>的出现次数,并确保存在相同数量的<\\t> 同样,它会计算y的出现次数,并确保有0实例。 针对这个问题 ,改编了countOccurrences方法的逻辑, 该问题针对的是字符串 countOccurrences 字符串的出现

在这里查看正在使用的代码

class Main {
    public static void main(String[] args) {
        String[] strings = {
            "yyyyyy$",
            "<t>yy<\\t>$",
            "<t><t>yyyyy<\\t><\\t>$",
            "<t><t>y<\\t>y<\\t><t>yyyyy<\\t>yy$",
            "<t><\\t>$",
            "<t>yy<t><\\t>$"
        };

        for(String s : strings) {
            if (countOccurrences("<t>", s) == countOccurrences("<\\t>", s) && countOccurrences("y", s) > 0) {
                System.out.println("Good: " + s);
            } else {
                System.out.println("Bad: " + s);
            }
        }
    }

    private static int countOccurrences(String needle, String haystack) {
        int lastIndex = 0;
        int count = 0;
        while (lastIndex != -1) {
                lastIndex = haystack.indexOf(needle, lastIndex);
                if (lastIndex != -1) {
                    count++;
                    lastIndex += needle.length();
                }
        }
        return count;
    }
}

结果:

Good: yyyyyy$
Good: <t>yy<\t>$
Good: <t><t>yyyyy<\t><\t>$
Good: <t><t>y<\t>y<\t><t>yyyyy<\t>yy$
Bad: <t><\t>$
Bad: <t>yy<t><\t>$

经过深入的研究和阅读,我得出的结论是,无法创建此类语言的正则表达式,因为它是无限的自动机(无法创建无限自动机的正则表达式)。 因此,要解决此问题,我们将必须直接创建CFG。 上述问题的CFG如下:

R --> <t>S<\t>$(1.1 production)
R-->SS$(1.2 production)
R-->y$(1.3 production)
S--><t>S<\t>(2.1 production)
S-->SS(2.2 production)
S-->y(2.3 production)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM