[英]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> ).
一些规范是:在任何正确的字符串中恰好有一个$,这始终是字符串中的最后一个符号。 $之前的字符串必须为非空,我们将其称为表达式。 表达式被递归定义为:
<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.