查找android studio 中所有的硬解码文字(双引号开头,双引号结尾)

本文介绍如何利用正则表达式在指定目录下查找包含中文字符加非双引号字符的文本,提供了一个可能包含小错误的正则表达式示例,并邀请读者分享更优解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

右键你想筛选的model,选择Find in path,在打开的界面,General-》Regular expression勾上,Scope中可以选择扫描的目录

在Text to find中输入:"[\u4E00-\u9FA5]+[^\"].*?"   然后进行Find(这个正则至少符合我的要求,可能也会有些Bug,因为我对正则也不是很熟悉,所以有更好的正则,也请留言告诉我)

<think>在Android开发中,`firePropertyChange`是JavaBeans规范中的方法,通常用于属性变更通知。在Android中,我们可能会在自定义View或数据绑定等场景中使用类似的方法。但需要注意的是,Android本身并没有直接使用`firePropertyChange`,而是有自己的一套观察者模式(如`Observable`和`Observer`)。不过,如果你在Android项目中遇到了这样的代码,可能是自定义的或者是使用了某些库。然而,你的问题是要匹配字符串:`firePropertyChange(“id”,oldValue,id);`注意这里你使用了中文引“”,而通常编程中使用的是英文引`"`。因此,我们需要明确要匹配的是哪种引。假设你实际上要匹配的是英文引(因为中文引在代码中很少见),但如果你确实需要匹配中文引,那么正则表达式需要调整。这里我将按照两种情况处理:情况1:匹配英文引(")正则表达式:`firePropertyChange\("([^"]+)",\s*(\w+),\s*(\w+)\);`情况2:匹配中文引(“”)注意:中文引有左右之分,这里左引是“,右引是”。在正则表达式中,我们需要明确匹配这两个字符。正则表达式:`firePropertyChange\("[^”]+”,\s*(\w+),\s*(\w+)\);`但是这里注意,输入字符串中你使用的是“和”,所以我们需要用对应的字符。但是,由于在大多数代码中我们使用英文引,并且你给出的例子中可能只是输入时的笔误(在问题中你使用了中文引,但实际代码可能是英文引),因此我将以英文引为例进行说明,同时也会给出中文引的匹配方式。另外,在Android中,我们可能使用Java或Kotlin,但正则表达式本身是语言无关的。下面我将分别给出Java和Kotlin的示例。一、针对英文引的正则表达式(推荐,因为代码中通常使用英文引):正则表达式:`firePropertyChange\\(\"([^\"]+)\",\\s*(\\w+),\\s*(\\w+)\\);`二、针对中文引的正则表达式:注意:中文引在字符串中直接写即可,但需要确保输入字符串中确实是中文引。由于左右引不同,我们分别匹配左引“和右引”。正则表达式:`firePropertyChange\\(([^”]+)”,\\s*(\\w+),\\s*(\\w+)\\);`下面给出Java代码示例(假设在Android的Java代码中使用)和Kotlin代码示例。1.Java示例(英文引):```javaimportjava.util.regex.Matcher;importjava.util.regex.Pattern;publicclassRegexExample{publicstaticvoidmain(String[]args){Stringinput="firePropertyChange(\"id\",oldValue,id);";//正则表达式,注意转义Stringregex="firePropertyChange\\(\"([^\"]+)\",\\s*(\\w+),\\s*(\\w+)\\);";Patternpattern=Pattern.compile(regex);Matchermatcher=pattern.matcher(input);if(matcher.find()){StringpropertyName=matcher.group(1);//"id"StringoldValueVar=matcher.group(2);//"oldValue"StringnewValueVar=matcher.group(3);//"id"System.out.println("propertyName:"+propertyName);System.out.println("oldValueVar:"+oldValueVar);System.out.println("newValueVar:"+newValueVar);}}}```2.Kotlin示例(英文引):```kotlinfunmain(){valinput="firePropertyChange(\"id\",oldValue,id);"valregex="""firePropertyChange\("([^"]+)",\s*(\w+),\s*(\w+)\);""".toRegex()valmatchResult=regex.find(input)if(matchResult!=null){val(propertyName,oldValueVar,newValueVar)=matchResult.destructuredprintln("propertyName:$propertyName")println("oldValueVar:$oldValueVar")println("newValueVar:$newValueVar")}}```3.如果使用中文引,Java示例:```javaStringinput="firePropertyChange(“id”,oldValue,id);";Stringregex="firePropertyChange\\(([^”]+)”,\\s*(\\w+),\\s*(\\w+)\\);";//其余代码同上```4.中文引的Kotlin示例:```kotlinvalinput="firePropertyChange(“id”,oldValue,id);"valregex="""firePropertyChange\(([^”]+)”,\s*(\w+),\s*(\w+)\);""".toRegex()//其余代码同上```解释:-正则表达式中的`\\(\\)`用于匹配字面括(因为括在正则中有特殊含义,需要转义)。-对于英文引,我们使用`\"`匹配双引号(在Java字符串中需要转义,所以写为`\\\"`,但在正则中实际是`\"`)。在Kotlin中,我们可以使用三引原始字符串,所以不需要对反斜杠转义。-对于中文引,直接写即可,不需要转义(因为它们不是正则元字符)。-`([^"]+)`或`([^”]+)`用于捕获引内的字符串(非贪婪方式,直到遇到右引)。-`\s*`匹配0个或多个空白字符(空格、制表符等)。-`(\w+)`匹配变量名(字母、数字、下划线)。注意:在Android中,如果是在字符串资源中匹配,或者从布局文件中匹配,那么可能还需要考虑空格变化(比如换行符),这时可以调整`\s*`为`\\s*`(在Java字符串中)以匹配任意空白。另外,如果参数中可能包含更复杂的表达式(比如带包名的变量、泛型等),那么`\w+`可能不够,需要扩展。但根据问题,我们只匹配简单的变量名。最后,如果方法调用前有对象实例,比如`bean.firePropertyChange(...)`,那么正则表达式需要调整,但这不在当前问题范围内。相关问题:§§相关问题§§:1.在Android开发中,如何实现属性变更监听(类似`firePropertyChange`的功能)?2.正则表达式中的`\w`能匹配哪些字符?它能否匹配Unicode字符(如中文变量名)?3.在Kotlin中,如何使用正则表达式进行多行匹配?4.如果方法参数中的变量名可能包含点(如`this.id`),如何修改正则表达式以适应这种情况?</think>### Android 中 `firePropertyChange("id", oldValue, id)` 的正则匹配解决方案 在 Android 开发中,`firePropertyChange()` 常用于数据绑定和属性变更通知。以下是针对该方法的正则匹配方案,考虑了 Android 特有的编码风格和常见变体。 #### 增强版正则表达式(兼容 Android 风格) ```regex (\w+\.)?firePropertyChange\s*\(\s*"([^"]+)"\s*,\s*([\w.$]+)\s*,\s*([\w.$]+)\s*\) ``` **解析说明:** 1. `(\w+\.)?` - 可选捕获组:匹配可能存在的对象实例(如 `view.` 或 `model.`) 2. `firePropertyChange` - 方法名匹配(大小写敏感) 3. `\s*\(\s*` - 兼容括前后的空格(Android Studio 自动格式化常见) 4. `"([^"]+)"` - **属性名捕获**:双引号内的任意内容 5. `\s*,\s*([\w.$]+)` - **旧值捕获**:允许变量名包含 `.` 和 `$`(Android 常见) 6. `\s*,\s*([\w.$]+)\s*\)` - **新值捕获**:同上,兼容结尾空格 #### Java/Kotlin 实现示例 ```kotlin // Kotlin 实现(Android 推荐) fun parsePropertyChange(code: String) { val regex = """(\w+\.)?firePropertyChange\s*\(\s*"([^"]+)"\s*,\s*([\w.$]+)\s*,\s*([\w.$]+)\s*\)""".toRegex() val match = regex.find(code) match?.let { val (instance, property, oldVal, newVal) = it.destructured println("实例: ${instance.removeSuffix(".")}") println("属性: $property") println("旧值: $oldVal") println("新值: $newVal") } } // 测试用例 parsePropertyChange("binding.firePropertyChange(\"id\", oldValue, data.id)") ``` **输出结果:** ``` 实例: binding 属性: id 旧值: oldValue 新值: data.id ``` #### 处理 Android 特有情况 1. **数据绑定支持** 添加 `BindingAdapter` 检测: ```kotlin val regex = """(@BindingAdapter\s*[\s\S]*?)?(\w+\.)?firePropertyChange""" ``` 2. **Kotlin 空安全支持** 兼容可空类型: ```regex ,\s*([\w.$]+(\?\.\w+)?)\s*, ``` 3. **Lambda 表达式** 匹配在 Lambda 中的调用: ```kotlin val lambdaRegex = """\{\s*[^}]*?firePropertyChange[^}]*?\}""".toRegex() ``` #### 完整 Android 解析工具 ```kotlin class PropertyChangeParser { companion object { private val MAIN_REGEX = """(\w+\.)?firePropertyChange\s*\(\s*"([^"]+)"\s*,\s*([\w.$]+(\?\.\w+)?)\s*,\s*([\w.$]+(\?\.\w+)?)\s*\)""".toRegex() fun parse(codeBlock: String): List<PropertyChangeCall> { return MAIN_REGEX.findAll(codeBlock).map { PropertyChangeCall( instance = it.groupValues[1].removeSuffix("."), property = it.groupValues[2], oldValue = it.groupValues[3], newValue = it.groupValues[5] ) }.toList() } } } data class PropertyChangeCall( val instance: String, val property: String, val oldValue: String, val newValue: String ) // 使用示例 val code = """ view.firePropertyChange("visibility", oldVis, View.VISIBLE) model.firePropertyChange("user", prevUser, currentUser) """.trimIndent() val calls = PropertyChangeParser.parse(code) calls.forEach { println(it) } ``` **输出:** ``` PropertyChangeCall(instance=view, property=visibility, oldValue=oldVis, newValue=View.VISIBLE) PropertyChangeCall(instance=model, property=user, oldValue=prevUser, newValue=currentUser) ``` ### 关键注意事项 1. **Android 特定字符** - 允许 `$`(合成属性) - 允许 `.`(链式调用) - 兼容 `?`(空安全操作符) 2. **格式兼容性** - 处理 Android Studio 自动格式化产生的空格 - 支持多行调用(通过 `[\s\S]*?`) 3. **性能优化** - 使用 `findAll()` 替代 `matches()` 处理大文件 - 预编译正则表达式(Kotlin `toRegex()`)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值