【问题标题】:pathsplitting in Android with regular expressions使用正则表达式在 Android 中进行路径分割
【发布时间】:2018-10-24 17:32:59
【问题描述】:

我在这里遵循了 Ajb 的建议 Splitting String using RegEx in Android 并这样做了:

@SuppressWarnings("JavaDoc")

public class DBUtility extends SQLiteOpenHelper {
    private static final String DB_NAME = "Angler.sqlite3";
    private static final int DB_VERSION = 1; //minimal 1, 0 nicht zulässig.

    private String DB_PATH_COMPLETE;
    private String DB_PATH;
    private String DB_PATH_DISPLAY;
    private SQLiteDatabase SQL_DB;
    private Context myContext;
    private String displayText;
    private BufferedReader Rdr;
    private char[] SQLstringAr;
    private String SQLstatementFile;
    private Cursor cur;

    /**
     * Constructor
     * Takes and keeps a reference of the passed context in order to access to the application assets and resources.
     * @param context
     */
    public DBUtility(Context context) {
        // Kann nicht private werden
        super(context, DB_NAME, null, DB_VERSION); //3. Parameter Wert null ist die CursorFactory

        myContext = context;
        DB_PATH = myContext.getDatabasePath(DB_NAME).getPath();
        String RegEx = "((/data/data/(w+\\.w+/w+/w+/))w+\\.w+)"; // /data/data/wolfgang_jakobi.anglerapp/databases/Angler.sqlite3
        Pattern p = Pattern.compile(RegEx);
        Matcher m = p.matcher(DB_PATH);
        String [] Groups = new String[3];
        if (m.find()) {
            Groups[0] = m.group(1); // /data/data/wolfgang_jakobi.anglerapp/databases/Angler.sqlite3
            Groups[1] = m.group(2); // /data/data/wolfgang_jakobi.anglerapp/databases/
            Groups[2] = m.group(4); // wolfgang_jakobi.anglerapp/databases/
        }

        DB_PATH_COMPLETE = Groups[0];
        DB_PATH = Groups[1];
        DB_PATH_DISPLAY = Groups[2];

        SQL_DB = super.getReadableDatabase();
    }

唉,条件 m.find() 不成立,所以代码在条件括号之后继续,我的所有组都保持为空,我不知道为什么。

感谢您的推荐。

沃尔夫冈

【问题讨论】:

    标签: java android regex


    【解决方案1】:

    我认为你的正则表达式是错误的。

    "((/data/data/(w+\\.w+/w+/w+/))w+\\.w+)"
    

    您似乎正在尝试使用 word 字符预定义字符类,但正如所写,您只是在寻找 w 字符。也就是说,您需要在模式中使用\\w 而不是w

    "((/data/data/(\\w+\\.\\w+/\\w+/\\w+/))\\w+\\.\\w+)"
    

    【讨论】:

    • 谢谢你,本。我会尽快尝试并报告结果。
    • 嗨,Ben,这个正则表达式"((/data/data/(\\w+\\.\\w+/\\w+/\\w+/))\\w+\\.\ \w+)" 适合你吗?在我的课堂上,我遇到了和以前一样的错误。
    【解决方案2】:

    我在 C++ 和 ABAP 中使用正则表达式开发了软件,可惜我在 Android Studio (JAVA) 中没有遵循相同的策略:已知模式组必须按字面意思设置到正则表达式中,然后可以替换逐渐每组都使用通配符,在本题中,我使用了 Ben 推荐的通配符“\w+”。

    这样做我发现我的分组是错误的,因为第三个“w+”是多余的,但我从未尝试过这个错误是否有任何影响。

    这是我的新代码,我将每一步替换为通配符作为注释:

    @SuppressWarnings("JavaDoc")
    
    public class DBUtility extends SQLiteOpenHelper {
        private static final String DB_NAME = "Angler.sqlite3";
        private static final int DB_VERSION = 1; //minimal 1, 0 nicht zulässig.
    
        private String DB_PATH_COMPLETE;
        private String DB_PATH;
        private String DB_PATH_DISPLAY;
        private SQLiteDatabase SQL_DB;
        private Context myContext;
        private String displayText;
        private BufferedReader Rdr;
        private char[] SQLstringAr;
        private String SQLstatementFile;
        private Cursor cur;
    
        /**
         * Constructor
         * Takes and keeps a reference of the passed context in order to access to the application assets and resources.
         * @param context
         */
        public DBUtility(Context context) {
            // Kann nicht private werden
            super(context, DB_NAME, null, DB_VERSION); //3. Parameter Wert null ist die CursorFactory
    
            myContext = context;
            DB_PATH = myContext.getDatabasePath(DB_NAME).getPath();
            //String RegEx = "((/data/data/(wolfgang_jakobi\\.anglerapp/databases/))Angler\\.sqlite3)";
            //                  /data/data/ wolfgang_jakobi  .anglerapp/databases/Angler.sqlite3
            //String RegEx = "((/data/data/(\\w+\\.anglerapp/databases/))Angler\\.sqlite3)";
            //String RegEx = "((/data/data/(\\w+\\.\\w+/databases/))Angler\\.sqlite3)";
            //String RegEx = "((/data/data/(\\w+\\.\\w+/\\w+/))Angler\\.sqlite3)";
            //String RegEx = "((/data/data/(\\w+\\.\\w+/\\w+/))\\w+\\.sqlite3)";
            String RegEx =      "((/data/data/(\\w+\\.\\w+   /\\w+/))\\w+\\.\\w+)";
            // previous version "((/data/data/(  w+\\.  w+/w+/  w+/))w+\\.w+)"
            Pattern p = Pattern.compile(RegEx);
            Matcher m = p.matcher(DB_PATH);
            String [] Groups = new String[3];
            if (m.find()) {
                Groups[0] = m.group(1); // /data/data/wolfgang_jakobi.anglerapp/databases/Angler.sqlite3
                Groups[1] = m.group(2); // /data/data/wolfgang_jakobi.anglerapp/databases/
                Groups[2] = m.group(3); // wolfgang_jakobi.anglerapp/databases/
            }
    
            DB_PATH_COMPLETE = Groups[0];
            DB_PATH = Groups[1];
            DB_PATH_DISPLAY = Groups[2];
    
            SQL_DB = super.getReadableDatabase();
        }
    

    这段代码运行良好。

    问候沃尔夫冈

    【讨论】:

    • 这样做我发现,我的分组是错误的,因为第三个“w+”是多余的,但我从未尝试过这个错误是否有任何影响。
    • 很明显正则表达式的结构和内容必须适合matcher-string的任何部分,否则m.find()方法不会变为真。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-11-20
    • 1970-01-01
    • 2014-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多