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)$");

代码具体参考:https://source.codeaurora.org/quic/la/platform/packages/providers/MediaProvider/tree/src/com/android/providers/media/scan/ModernMediaScanner.java?h=aosp-new/master#138

先看下正则表达式的语法:

^

匹配输入字符串开始的位置。如果设置了 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' 更经济的表达式。

x|y

匹配 x 或 y。例如,'z|food' 匹配"z"或"food"。'(z|f)ood' 匹配"zood"或"food"。

[xyz]

字符集。匹配包含的任一字符。例如,"[abc]"匹配"plain"中的"a"。

[^xyz]

反向字符集。匹配未包含的任何字符。例如,"[^abc]"匹配"plain"中"p","l","i","n"。

[a-z]

字符范围。匹配指定范围内的任何字符。例如,"[a-z]"匹配"a"到"z"范围内的任何小写字母。

参考:Java 正则表达式

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

解答:

(?i) 表示所在位置右侧的表达式开启忽略大小写模式

参考:

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

对后面的表达式的理解:

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

具体通过一个java示例来确定PATTERN_VISIBLE

        String[] paths = {"/storage/emulated/0","/storage/sdcard1","/storage/usbotg","/storage/5D33-1608","/storage/0","/storage/a","/storage/2emulated/0","/storage","/storage//emulated/0","/storage///emulated/0","/storage/emulated/0/","/storage/5D33-1608/","/system/media/audio","/storage/emulated/0/Android/sandbox","/storage/emulated/0/Android/sandbox/","/storage/emulated/0/Android/sandbox/abc","/storage/emulated/0/Android/sandbox/abc/","/storage/emulated/0/Android/sandbox/abc/def"};for (String path : paths) {if (PATTERN_VISIBLE.matcher(path).matches()) {System.out.println("PATTERN_VISIBLE matches " + path);} else {System.out.println("PATTERN_VISIBLE NOT matches " + path);}}

输出结果如下:

PATTERN_VISIBLE matches /storage/emulated/0
PATTERN_VISIBLE matches /storage/sdcard1
PATTERN_VISIBLE matches /storage/usbotg
PATTERN_VISIBLE matches /storage/5D33-1608
PATTERN_VISIBLE matches /storage/0
PATTERN_VISIBLE matches /storage/a
PATTERN_VISIBLE matches /storage/2emulated/0
PATTERN_VISIBLE NOT matches /storage
PATTERN_VISIBLE NOT matches /storage//emulated/0
PATTERN_VISIBLE NOT matches /storage///emulated/0
PATTERN_VISIBLE NOT matches /storage/emulated/0/
PATTERN_VISIBLE NOT matches /storage/5D33-1608/
PATTERN_VISIBLE NOT matches /system/media/audio
PATTERN_VISIBLE NOT matches /storage/emulated/0/Android/sandbox
PATTERN_VISIBLE NOT matches /storage/emulated/0/Android/sandbox/
PATTERN_VISIBLE matches /storage/emulated/0/Android/sandbox/abc
PATTERN_VISIBLE NOT matches /storage/emulated/0/Android/sandbox/abc/
PATTERN_VISIBLE NOT matches /storage/emulated/0/Android/sandbox/abc/def

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

  1. Android Q中通知的设置

    Android Q中通知的设置项 AndroidQ中,进入系统设置–通知中心,可以对通知的显示进行设置.其中常用的两个: (1)锁定屏幕上的通知 对应的字段: Settings.Secure.LOCK ...

  2. Android Q (十八) 非 SDK 接口在 Android Q 中的受限情况出现变化

    非 SDK 接口在 Android Q 中的受限情况出现变化 为了帮助确保应用稳定性和兼容性,此平台开始限制您的应用可在 Android 9(API 级别 28)中使用的非 SDK 接口.Androi ...

  3. Android 10 (Android Q)中的屏幕刷新率(display refresh rate)切换方法和策略

           本文禁止转载,如有需求,请联系作者. 1. 屏幕刷新率和应用的显示帧率 首先请区分好屏幕刷新率(Panel Refresh Rate)和应用的帧率(APP Frame Rate)两个概念 ...

  4. Android开发中手机存储路径问题

    安卓手机文件夹storage/emulated下面有两个文件夹0和legacy? 它们里面的文件是一模一样的,都跟主界面 的文档点开来是一样的,那 0 和 legacy两个文件夹是什么关系,为什么?里 ...

  5. android Q版本外部存储问题以及获取空间大小问题

    Q版本: 1.在manifest 文件中添加权限 <uses-permission android:name="android.permission.WRITE_EXTERNAL_ST ...

  6. android存储视频文件夹在哪,Android 中 视频存储路径的一个方案

    版权声明:本文为博主原创文章,未经博主允许不得转载. 在进行视频的下载时,我们经常会面临存储路径的选择,选择一个好的存储路径能对Android系统中的内存起到优化的作用.主流app下载路径分析和常见的 ...

  7. Android Q 获取设备唯一ID(UDID\GUID\UUID\SSAID\GAID)

    Android Q获取设备唯一ID(UDID\GUID\UUID\SSAID\GAID) 一.简介 1.1 问题背景 1.2 关键技术 二.解决方案 2.1 谷歌官方推荐方案 (4种) 2.2 实现方 ...

  8. 适配Android Q指南

    一 .行为变更:所有应用 Android Q 平台包含一些行为变更,这些变更可能会影响您的应用.以下行为变更将影响在 Android Q 上运行的所有应用,无论其采用哪种 targetSdkVersi ...

  9. Android Q(10.0)版本新特性以及兼容性适配

    北京时间2019年3月14日Google正式对外发布Android Q Beta 1及预览版SDK,这意味着安卓开发者们又即将迎来一年一度的新版本适配工作了.Android Q 为开发者们带来了许多新 ...

最新文章

  1. 【周末阅读】2019自动驾驶十大关键词
  2. Android10.0 ContentProvider原理分析
  3. findcontours函数_opencv轮廓findContoursamp;drawContours
  4. Java并发:线程池详解(ThreadPoolExecutor)
  5. 导出Android手机应用apk
  6. Fomo3d常见问题
  7. [Python人工智能] 二.TensorFlow基础及一元直线预测案例
  8. Mac下Apache使用
  9. cannot convert value of type ‘org.codehaus.xfire.spring.editors.ServiceFactoryEditor
  10. oracle十进制函数语法,Oracle 十进制、二进制互相转换自定义函数
  11. Tex, LaTex概念及实例
  12. 三位数除以两位数怎么算竖式_苏教版三年级数学上册4.6笔算三位数除以一位数(首位不够除)微课视频 | 练习...
  13. 实战Python:利用Python和PyQt5实现瑞幸咖啡点餐系统
  14. 视频教程-大数据编程语言scala讲座-其他
  15. sb3转换exe_SB转exe或swf(sb3toSB2.rar
  16. 手机音频拼接软件_技能帖 | 专业又好上手的音频剪辑攻略
  17. Axure RP 9基础教程(2)——交互样式
  18. ubuntu生成pem证书连接服务器(已验证)
  19. matlab中用xlsread()函数在Excel中读取数据
  20. docker 容器健康检查

热门文章

  1. STM32基础学习笔记(2)---独立看门狗
  2. postfix+dovecot+SSL 搭建邮件服务器
  3. OpenCV:图像锐化处理、提高图像对比度
  4. Ubuntu U盘安装时安装时卡在Syslinux的问题
  5. python scrapy 爬取妹子图的照片
  6. MongoDB---数据类型,集合操作
  7. Amazone S3 生成公网链接
  8. python第5课:递归函数
  9. matlab功率谱密度单位,功率谱密度的工程单位和国际制单位
  10. OpenGL总结15-光照模型