Android Q中外部存储盘路径正则表达式的理解
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中外部存储盘路径正则表达式的理解相关推荐
- Android Q中通知的设置
Android Q中通知的设置项 AndroidQ中,进入系统设置–通知中心,可以对通知的显示进行设置.其中常用的两个: (1)锁定屏幕上的通知 对应的字段: Settings.Secure.LOCK ...
- Android Q (十八) 非 SDK 接口在 Android Q 中的受限情况出现变化
非 SDK 接口在 Android Q 中的受限情况出现变化 为了帮助确保应用稳定性和兼容性,此平台开始限制您的应用可在 Android 9(API 级别 28)中使用的非 SDK 接口.Androi ...
- Android 10 (Android Q)中的屏幕刷新率(display refresh rate)切换方法和策略
本文禁止转载,如有需求,请联系作者. 1. 屏幕刷新率和应用的显示帧率 首先请区分好屏幕刷新率(Panel Refresh Rate)和应用的帧率(APP Frame Rate)两个概念 ...
- Android开发中手机存储路径问题
安卓手机文件夹storage/emulated下面有两个文件夹0和legacy? 它们里面的文件是一模一样的,都跟主界面 的文档点开来是一样的,那 0 和 legacy两个文件夹是什么关系,为什么?里 ...
- android Q版本外部存储问题以及获取空间大小问题
Q版本: 1.在manifest 文件中添加权限 <uses-permission android:name="android.permission.WRITE_EXTERNAL_ST ...
- android存储视频文件夹在哪,Android 中 视频存储路径的一个方案
版权声明:本文为博主原创文章,未经博主允许不得转载. 在进行视频的下载时,我们经常会面临存储路径的选择,选择一个好的存储路径能对Android系统中的内存起到优化的作用.主流app下载路径分析和常见的 ...
- 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 实现方 ...
- 适配Android Q指南
一 .行为变更:所有应用 Android Q 平台包含一些行为变更,这些变更可能会影响您的应用.以下行为变更将影响在 Android Q 上运行的所有应用,无论其采用哪种 targetSdkVersi ...
- Android Q(10.0)版本新特性以及兼容性适配
北京时间2019年3月14日Google正式对外发布Android Q Beta 1及预览版SDK,这意味着安卓开发者们又即将迎来一年一度的新版本适配工作了.Android Q 为开发者们带来了许多新 ...
最新文章
- 【周末阅读】2019自动驾驶十大关键词
- Android10.0 ContentProvider原理分析
- findcontours函数_opencv轮廓findContoursamp;drawContours
- Java并发:线程池详解(ThreadPoolExecutor)
- 导出Android手机应用apk
- Fomo3d常见问题
- [Python人工智能] 二.TensorFlow基础及一元直线预测案例
- Mac下Apache使用
- cannot convert value of type ‘org.codehaus.xfire.spring.editors.ServiceFactoryEditor
- oracle十进制函数语法,Oracle 十进制、二进制互相转换自定义函数
- Tex, LaTex概念及实例
- 三位数除以两位数怎么算竖式_苏教版三年级数学上册4.6笔算三位数除以一位数(首位不够除)微课视频 | 练习...
- 实战Python:利用Python和PyQt5实现瑞幸咖啡点餐系统
- 视频教程-大数据编程语言scala讲座-其他
- sb3转换exe_SB转exe或swf(sb3toSB2.rar
- 手机音频拼接软件_技能帖 | 专业又好上手的音频剪辑攻略
- Axure RP 9基础教程(2)——交互样式
- ubuntu生成pem证书连接服务器(已验证)
- matlab中用xlsread()函数在Excel中读取数据
- docker 容器健康检查