簡體   English   中英

使用正則表達式在Android中進行路徑分割

[英]pathsplitting in Android with regular expressions

我在這里遵循Ajb的建議, 在Android中使用RegEx拆分字符串 ,並這樣做:

@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();
    }

the,條件m.find()變為不正確,因此代碼在條件括號內並且我所有的組都為空之后繼續執行,我不知道為什么。

感謝您的推薦。

沃爾夫岡

我認為您的正則表達式是錯誤的。

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

看起來您正在嘗試使用單詞字符預定義字符類 ,但是按照書面說明,您只是在尋找w字符。 也就是說,您需要在模式中使用\\\\w而不是w

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

我用C ++和ABAP開發了帶有正則表達式的軟件,可惜我在Android Studio(JAVA)中沒有遵循相同的策略:已知的模式組必須先將其設置為正則表達式,然后才能逐漸替換每個組通過通配符,在本問題中,我使用通配符“ \\ w +”作為Ben的建議。

這樣做后,我發現我的分組很麻煩,因為第三個“ 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();
    }

此代碼可以正常工作。

沃爾夫岡的問候

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM