Java中如何使用带通配符的正则表达式匹配前后为非a-z字符的目标串?
问题解答
1. 能否用正则实现需求
可以。你用到的负向断言思路完全符合要求:
(?<![a-z])是负向回顾断言,确保目标字符串前面的字符不属于小写a-z范围,目标字符串在整个文本开头的场景也能正常覆盖(?![a-z])是负向前瞻断言,确保目标字符串后面的字符不属于小写a-z范围,目标字符串在整个文本结尾的场景也能正常覆盖
2. 能否直接用String.matches()配合你写的正则实现
不能。
Java的String.matches()方法要求正则表达式匹配整个输入字符串,你写的正则只能匹配到目标字符串本身(附带前后断言校验),只有当整个phrase内容就是target时才会返回true,其余场景都会匹配失败。
正确实现方案
如果需要获取首次出现的位置,使用Pattern+Matcher组合即可:
// 要搜索的目标字符串,这里以hello为例 String target = "hello"; // 用Pattern.quote转义target里的正则特殊字符,避免非预期匹配 Pattern pattern = Pattern.compile("(?<![a-z])" + Pattern.quote(target) + "(?![a-z])"); Matcher matcher = pattern.matcher(phrase); if (matcher.find()) { // 首次出现的起始索引 int firstOccurIndex = matcher.start(); }
如果仅需要判断是否存在这样的匹配,非要用String.matches()的话,需要修改正则,前后补全任意字符匹配:
boolean isExist = phrase.matches(".*(?<![a-z])" + Pattern.quote(target) + "(?![a-z]).*");
内容的提问来源于stack exchange,提问作者DCR
相关产品推荐
相关产品推荐

