如何在未知精确子串的前提下搜索SpannableString并获取匹配项位置与长度
解决方案
实现思路
- 先将SpannableString转为普通String,使用正则表达式匹配
[size=??]格式的子串,正则规则为\[size=.*?\],其中非贪婪匹配符.*?可以匹配两个定界符之间的任意长度任意字符,不会出现跨匹配的问题。 - 匹配到结果后可直接获取匹配项的起始索引、子串长度。
代码示例
Kotlin 版本
val spannable = SpannableString("string [size=212] more string") // 编译正则规则 val pattern = Pattern.compile("\\[size=.*?\\]") val matcher = pattern.matcher(spannable.toString()) if (matcher.find()) { val startIndex = matcher.start() // 匹配项起始索引,示例中返回7 val matchLength = matcher.end() - matcher.start() // 匹配项长度,示例中返回10 val matchContent = matcher.group() // 匹配到的完整子串,示例中返回[size=212] // 后续业务逻辑 }
Java 版本
SpannableString spannable = new SpannableString("string [size=212] more string"); Pattern pattern = Pattern.compile("\\[size=.*?\\]"); Matcher matcher = pattern.matcher(spannable.toString()); if (matcher.find()) { int startIndex = matcher.start(); // 匹配项起始索引 int matchLength = matcher.end() - matcher.start(); // 匹配项长度 String matchContent = matcher.group(); // 匹配到的完整子串 // 后续业务逻辑 }
多匹配场景处理
如果需要匹配字符串中所有符合规则的子串,把if (matcher.find())替换为while (matcher.find())遍历所有结果即可。
内容的提问来源于stack exchange,提问作者Tamzid
相关产品推荐
相关产品推荐

