Android Q中外部存储盘路径正则表达式的理解

ameyume
博客专家认证
2019-10-12 04:55:20
Android Q的ModernMediaScanner.java文件中以下两个正则表达式,具体该怎么解读?
    private static final Pattern PATTERN_VISIBLE = Pattern.compile(
"(?i)^/storage/[^/]+(?:/[0-9]+)?(?:/Android/sandbox/([^/]+))?$");
private static final Pattern PATTERN_INVISIBLE = Pattern.compile(
"(?i)^/storage/[^/]+(?:/[0-9]+)?(?:/Android/sandbox/([^/]+))?/Android/(?:data|obb)$");


先看下正则表达式的语法:
^ 匹配输入字符串开始的位置。如果设置了 RegExp 对象的 Multiline 属性,^ 还会与"\n"或"\r"之后的位置匹配。
$ 匹配输入字符串结尾的位置。如果设置了 RegExp 对象的 Multiline 属性,$ 还会与"\n"或"\r"之前的位置匹配。
* 零次或多次匹配前面的字符或子表达式。例如,zo* 匹配"z"和"zoo"。* 等效于 {0,}。
+ 一次或多次匹配前面的字符或子表达式。例如,"zo+"与"zo"和"zoo"匹配,但与"z"不匹配。+ 等效于 {1,}。
? 零次或一次匹配前面的字符或子表达式。例如,"do(es)?"匹配"do"或"does"中的"do"。? 等效于 {0,1}。
(?:pattern) 匹配 pattern 但不捕获该匹配的子表达式,即它是一个非捕获匹配,不存储供以后使用的匹配。这对于用"or"字符 (|) 组合模式部件的情况很有用。例如,'industr(?:y|ies) 是比 'industry|industries' 更经济的表达式。

疑问:
最前面的(?i)表示什么呢?

理解:
对于PATTERN_VISIBLE 可以理解为,以"/storage/"开头;
"[^/]+" 表示后面一个或多个除'/'外的字符;
"(?:/[0-9]+)?" 表示再跟零个或多个,至少一个0-9的数字;那是至少一个数字,还是可以一个数字都没有呢?
"(?:/Android/sandbox/([^/]+))?" 理解同上,是有零个或一个字符串"/Android/sandbox/",并且字符串后面不是'/'
'$' 表示字符串结束;

那么,简单的理解是"/storage/0"或者"/storage/0/Android/sandbox/"?
正常的路径不应该是"/storage/emulated/0"开头吗?
...全文
168 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
ameyume 2019-10-14
  • 打赏
  • 举报
回复
引用 1 楼 usecf 的回复:
Q:经常看见的正则前面的 (?i) (?s) (?m) (?is) (?im) 是什么意思? A: 称为内联匹配模式,通常用内联匹配模式代替使用枚举值RegexOptions指定的全局匹配模式,写起来更简洁。   (?i) 表示所在位置右侧的表达式开启忽略大小写模式   (?s) 表示所在位置右侧的表达式开启单行模式。   更改句点字符 (.) 的含义,以使它与每个字符(而不是除 \n 之外的所有字符)匹配。   注意:(?s)通常在匹配有换行的文本时使用   (?m) 表示所在位置右侧的表示式开启指定多行模式。   更改 ^ 和 $ 的含义,以使它们分别与任何行的开头和结尾匹配,   而不只是与整个字符串的开头和结尾匹配。   注意:(?m)只有在正则表达式中涉及到多行的“^”和“$”的匹配时,才使用Multiline模式。   上面的匹配模式可以组合使用,比如(?is),(?im)。   另外,还可以用(?i:exp)或者(?i)exp(?-i)来指定匹配的有效范围。 原文链接:https://blog.csdn.net/zhang__ao/article/details/78092294
非常感谢!
usecf 2019-10-14
  • 打赏
  • 举报
回复
Q:经常看见的正则前面的 (?i) (?s) (?m) (?is) (?im) 是什么意思? A: 称为内联匹配模式,通常用内联匹配模式代替使用枚举值RegexOptions指定的全局匹配模式,写起来更简洁。   (?i) 表示所在位置右侧的表达式开启忽略大小写模式   (?s) 表示所在位置右侧的表达式开启单行模式。   更改句点字符 (.) 的含义,以使它与每个字符(而不是除 \n 之外的所有字符)匹配。   注意:(?s)通常在匹配有换行的文本时使用   (?m) 表示所在位置右侧的表示式开启指定多行模式。   更改 ^ 和 $ 的含义,以使它们分别与任何行的开头和结尾匹配,   而不只是与整个字符串的开头和结尾匹配。   注意:(?m)只有在正则表达式中涉及到多行的“^”和“$”的匹配时,才使用Multiline模式。   上面的匹配模式可以组合使用,比如(?is),(?im)。   另外,还可以用(?i:exp)或者(?i)exp(?-i)来指定匹配的有效范围。 原文链接:https://blog.csdn.net/zhang__ao/article/details/78092294

80,351

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧