Java通配符分隔符

Java通配符分隔符,java,pattern-matching,Java,Pattern Matching,我最近一直在研究通配符模式匹配,其格式为: "http(yyy|xxx|zzz|fssadasd|asdasd|asdasdas|asdasdasd|://)www.w3schools(.com|.org|.net).*" 有关数据: 我开发了一个模式匹配函数,在格式为单括号(多个或运算符)时执行。如何存储上述格式的所有可能组合(多个括号和多个运算符) 一些可能的组合: httpyyyw3schools.com* httpxxxw3schools.com* httpzzzw3schools.

我最近一直在研究通配符模式匹配,其格式为:

"http(yyy|xxx|zzz|fssadasd|asdasd|asdasdas|asdasdasd|://)www.w3schools(.com|.org|.net).*"
有关数据:

我开发了一个模式匹配函数,在格式为单括号(多个或运算符)时执行。如何存储上述格式的所有可能组合(多个括号和多个运算符)

一些可能的组合:

httpyyyw3schools.com*

httpxxxw3schools.com*

httpzzzw3schools.com*

httpyyyw3.net*

httpxxxw3schools.net*

httpzzzw3schools.net.*等

如果问题还不清楚,请告诉我

模式匹配功能是:

import java.util.*;
import java.util.regex.Pattern;
import java.util.regex.Matcher;
public class wildcardtest
{
    public static void main(String[] args) 
    {

    test("h*p(://|xxx)ww*", "http://www.w3schools.com/html/tryit.asp?filename=tryhtml_default"); 
    test("h*p(yyy|://)ww*", "http://www.w3schools.com/html/tryit.asp?filename=tryhtml_default"); 
    test("h*p(yyy|xxx|zzz|fssadasd|asdasd|asdasdas|asdasdasd|://)ww*", "http://www.w3schools.com/html/tryit.asp?filename=tryhtml_default"); 
    test("ge?ks*", "geeksforgeeks");
    test("g*k", "gee");
    test("*pqrs", "pqrst");
    test("abc*bcd", "abcdhghgbcd");
    test("abc*c?d", "abcd");
    test("*c*d", "abcd");
    test("*?c*d", "abcd");
    test("*", "abcd");
    test("?", "a");
    }

    static boolean matches(String format, String data) {

        if(format.contains("|"))
        {

            int openpos = format.indexOf("(");
            int closepos = format.indexOf(")");

            String match = "";
            Pattern p = Pattern.compile("\\((.*?)\\)");
            Matcher m = p.matcher(format);

                while(m.find()) 
                {
                    match = m.group(1);
                }

            String after = format.substring(closepos+1);
            String[] spliiter = match.split(Pattern.quote("|"));

            for(int i = 0;i<spliiter.length;i++)
            {
                 StringBuilder before = new StringBuilder(format.substring(0,openpos));
                 before.append(spliiter[i]).append(after);      

                 if (matches(before.toString(),data)) {
                    return true;
                 }

            }           
            return false;
        }



    if (format.length() == 0 && data.length() == 0)
        return true;

    if (format.length() == 1 && format.charAt(0) == '*')
        return true;

    if (format.length() == 0 && data.length() > 0)
        return false;

    if (format.charAt(0) == '*' && format.charAt(1) != 0 && data.length() == 0)
        return false;

    if (format.charAt(0) == '?' || format.charAt(0) == data.charAt(0))
        return matches(format.substring(1), data.substring(1));

    if (format.charAt(0) == '*')
        return matches(format.substring(1), data) || matches(format, data.substring(1));

    return false;
}

    static void test(String first, String second)
    { 
        System.out.println(matches(first, second)); 
    }

}
import java.util.*;
导入java.util.regex.Pattern;
导入java.util.regex.Matcher;
公共类通配符测试
{
公共静态void main(字符串[]args)
{
测试(“h*p(://xxx)ww*,”http://www.w3schools.com/html/tryit.asp?filename=tryhtml_default"); 
测试(“h*p(yyy:/)ww*,”http://www.w3schools.com/html/tryit.asp?filename=tryhtml_default"); 
测试(“h*p(yyy | xxx | zzz | fssadasd | asdasd | asdasdas | asdasdasd |:/)ww*,”http://www.w3schools.com/html/tryit.asp?filename=tryhtml_default"); 
测试(“ge?ks*”,“Geeksforgeks”);
测试(“g*k”、“gee”);
试验(“pqrs”、“pqrst”);
测试(“abc*bcd”、“ABCDHGBCD”);
测试(“abc*c?d”、“abcd”);
测试(“*c*d”、“abcd”);
试验(“*?c*d”、“abcd”);
测试(“*”,“abcd”);
测试(“?”,“a”);
}
静态布尔匹配(字符串格式、字符串数据){
if(format.contains(“|”)格式)
{
int openpos=format.indexOf(“”);
int closepos=format.indexOf(“)”;
字符串匹配=”;
Pattern p=Pattern.compile(“\\(.*?\\)”;
Matcher m=p.Matcher(格式);
while(m.find())
{
匹配=m组(1);
}
后面的字符串=format.substring(closepos+1);
String[]spliiter=match.split(Pattern.quote(“|”);
对于(int i=0;i 0)
返回false;
if(format.charAt(0)='*'&&format.charAt(1)!=0&&data.length()==0)
返回false;
if(format.charAt(0)='?'| format.charAt(0)=data.charAt(0))
返回匹配项(format.substring(1)、data.substring(1));
if(format.charAt(0)='*')
返回匹配项(format.substring(1),data)|匹配项(format,data.substring(1));
返回false;
}
静态无效测试(先串,后串)
{ 
System.out.println(匹配(第一,第二));
}
}

我不知道有任何库方法可以做到这一点

考虑一般问题:

编写一个函数,列出与给定正则表达式匹配的所有可能字符串

如果正则表达式包含一个
*
,那么结果将是一组无限的字符串(或者如果我们将自己限制为Java
String
对象,那么这个集合将是有限的,但无法表示得太大)

如果我们将函数限制为仅覆盖替换,那么我们将得到一组有限的可能字符串。但是:

  • 该功能通常没有用处,而且(AFAIK)没有人想过将其作为库方法实现
  • 除非您的正则表达式语言排除了
    *
    ,否则您生成的测试用例可能无法充分覆盖您尝试测试的功能
但你能实施它吗


是的,你可以。但是你需要编写一个解析器来解析输入正则表达式才能做到这一点。我的直觉是,你将花费大量时间编写和测试该解析器。这比用手写/硬连接的字符串集来编写测试用例所需的时间要多,这些字符串集与每个示例正则表达式匹配。

我不知道有什么问题y库方法将执行此操作

考虑一般问题:

编写一个函数,列出与给定正则表达式匹配的所有可能字符串

如果正则表达式包含一个
*
,那么结果将是一组无限的字符串(或者如果我们将自己限制为Java
String
对象,那么这个集合将是有限的,但无法表示得太大)

如果我们将函数限制为仅覆盖替换,那么我们将得到一组有限的可能字符串。但是:

  • 该功能通常没有用处,而且(AFAIK)没有人想过将其作为库方法实现
  • 除非您的正则表达式语言排除了
    *
    ,否则您生成的测试用例可能无法充分覆盖您尝试测试的功能
但你能实施它吗


是的,你可以。但是你需要编写一个解析器来解析输入正则表达式才能做到这一点。我的直觉是,你将花费大量时间编写和测试该解析器。比用手写/硬连接的字符串集来编写测试用例所需的时间要多,这些字符串集与每个示例正则表达式匹配。

你说的“如何”是什么意思我可以存储吗?另外,如果
www.
是可选的,那么使用
(?:www\)?
一般来说,要匹配文本
您需要在模式中使用
。就性能而言,
(.com |.org |.net)
输给
(\。(?:com | org | net))
@WiktorStribiżew我需要将这些组合存储在一个列表中,以便将其传递给我的通配符模式匹配函数,上面给出的格式只是一个示例测试用例。主要目的是接受包含多个OR条件的多个括号输入。然后请显示您的代码。您确定我会发布代码我已经包含了code在我的问题中……请仔细检查一下,你说我如何去存储是什么意思?另外,如果
www.
是可选的,那么使用
(?:www\)?
一般来说,为了匹配文本
,你需要在模式中使用
.
(.com.org.net)
输给
(?:com.org.net))
@WiktorStribiżew我需要存储这些组合