Java正则表达式匹配三位版本格式失效问题求助
正则表达式匹配问题解决
问题描述
现有Java代码如下:
import java.util.regex.Matcher; import java.util.regex.Pattern; public class Main { public static void main(String args[]) { String pageText = "Other Strings 9.5.1 My Other Strings"; String pageText2 = "Other Strings 9.3.1.1.1 My Other Strings"; Pattern anyServicePattern = Pattern.compile("(\\d+\\.){2}[0-9]\\s+[a-zA-Z]+"); Matcher anyServiceMatcher = anyServicePattern.matcher(pageText); if (anyServiceMatcher.find()) { System.out.println("Found"); } else { System.out.println("Not Found"); } Matcher anyServiceMatcher2 = anyServicePattern.matcher(pageText2); if (anyServiceMatcher2.find()) { System.out.println("Found"); } else { System.out.println("Not Found"); } } }
当前程序输出:
Found Found
期望输出:
Found Not Found
需求为匹配格式:任意字符 + 数字.数字.数字 + 单个或多个空格 + 任意字符,即仅匹配三段式版本号(如9.5.1),排除更长的多段版本号(如9.3.1.1.1)。
解决方案
修改正则表达式,添加负向预查确保三段式版本号后不会紧跟小数点,避免匹配长版本号的前三个分段。
正确的正则表达式为:
"(\\d+\\.){2}\\d+(?!\\.)\\s+[a-zA-Z]+"
修改后的完整代码
import java.util.regex.Matcher; import java.util.regex.Pattern; public class Main { public static void main(String args[]) { String pageText = "Other Strings 9.5.1 My Other Strings"; String pageText2 = "Other Strings 9.3.1.1.1 My Other Strings"; Pattern anyServicePattern = Pattern.compile("(\\d+\\.){2}\\d+(?!\\.)\\s+[a-zA-Z]+"); Matcher anyServiceMatcher = anyServicePattern.matcher(pageText); if (anyServiceMatcher.find()) { System.out.println("Found"); } else { System.out.println("Not Found"); } Matcher anyServiceMatcher2 = anyServicePattern.matcher(pageText2); if (anyServiceMatcher2.find()) { System.out.println("Found"); } else { System.out.println("Not Found"); } } }
原理说明
(\\d+\\.){2}:匹配两段数字+小数点(如9.5.)\\d+:匹配第三个数字段(如1)(?!\\.):负向预查,确保当前位置后不是小数点,排除长版本号的匹配(如9.3.1后面紧跟.时不满足条件)\\s+:匹配一个或多个空格[a-zA-Z]+:匹配后续的字母内容
执行修改后的代码,输出将符合期望:
Found Not Found
内容的提问来源于stack exchange,提问作者mukund
相关产品推荐
相关产品推荐

