Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/397.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何验证JSoup选择字符串_Java_Validation_Selector_Jsoup - Fatal编程技术网

Java 如何验证JSoup选择字符串

Java 如何验证JSoup选择字符串,java,validation,selector,jsoup,Java,Validation,Selector,Jsoup,我正在开发一个程序,让用户有机会定义自己的选择字符串。例如,在表达式中: doc.select("a[href]"); 用户将指定“a[href]”部分。现在我的问题是,如何检查传入的字符串是否是有效的JSoup选择器字符串?有人知道如何验证这一点吗 任何帮助都将不胜感激 感谢检查jsoup源代码:您可以使用。选择器正在使用非公共的QueryParser,但您也可以“检查”它。方法1:编辑Jsoup源代码,将解析器公开,或在那里实现您自己的方法 方法2:解析一个简单的伪元素并捕获异常。如果抛出

我正在开发一个程序,让用户有机会定义自己的选择字符串。例如,在表达式中:

doc.select("a[href]");
用户将指定“a[href]”部分。现在我的问题是,如何检查传入的字符串是否是有效的JSoup选择器字符串?有人知道如何验证这一点吗

任何帮助都将不胜感激


感谢检查jsoup源代码:您可以使用。选择器正在使用非公共的QueryParser,但您也可以“检查”它。

方法1:编辑Jsoup源代码,将解析器公开,或在那里实现您自己的方法

方法2:解析一个简单的伪元素并捕获异常。如果抛出一个:查询无效,否则就可以了。这不是最好的解决方案,但很有效

下面是一个例子:

测试:

测试结果:


我目前使用的方法与您建议的方法类似,但希望搜索更高效的内容。您知道,截至2019年,Jsoup是否发布了任何公共方法或类来处理此问题吗?
private static final Element dummy = new Element(Tag.valueOf("p"), ""); // used for "testparsing"

// ...

public static boolean isValid(String query)
{
    if( query == null ) // Check for null
        return false;

    try
    {
        Selector.select(query, dummy); // Use the querystring on the dummy - returnvalue is not relevant
    }
    catch( Selector.SelectorParseException | IllegalArgumentException ex ) // these exceptions are thrown if something is not ok
    {
        return false; // If something is not ok, the query is invalid
    }

    return true; // All ok, query is valid
}
System.out.println(isValid(null)); // not valid
System.out.println(isValid("div.abc")); // valid
System.out.println(isValid("p[")); // not valid
System.out.println(isValid("a:matchesxy")); // not valid
System.out.println(isValid("div > a")); // valid
false
true
false
false
true