Java正则表达式转义问题:非法类别速记符报错求助
解决Java正则表达式的"Illegal category shorthand"错误
首先咱们拆解下你遇到的问题根源:
你原本想用正则(\plan)+(\d{5})匹配文本,但在Java字符串里转义后变成了((\\plan)+(\\d{5})),导致IntelliJ报错"Illegal category shorthand"——这个错误出在\\p位置,核心原因是你误用了正则中的\p特殊序列。
为什么会报错?
正则里的\p是专门用来指定Unicode字符类别的标记(比如\p{Digit}等价于\d表示数字,\p{Lower}表示小写字母),它必须遵循\p{类别名称}的格式。但你写的\plan(转义后Java里是\\plan),会被正则引擎解析为\p后面跟lan,这根本不是一个合法的字符类别,所以直接触发了语法错误。
你的需求对应的正确写法
假设你的真实需求是匹配一个或多个连续的"plan"字符串,后面紧跟5位数字,那需要做两个关键修正:
- 去掉
plan前面多余的反斜杠——你应该是想匹配字面量的"plan",而非使用\p的特殊语法; - 保持Java正则转义规则:
\d要写成\\d。
场景1:完全匹配整个输入字符串(用matches()方法)
if(argIds.matches("(plan)+(\\d{5})")) { // 你的业务逻辑代码 }
场景2:匹配输入字符串中包含的子串(matches()是全匹配,此场景更适合用Pattern+Matcher)
Pattern pattern = Pattern.compile("(plan)+(\\d{5})"); Matcher matcher = pattern.matcher(argIds); if(matcher.find()) { // 获取第一个匹配结果的各分组内容 String fullMatch = matcher.group(0); // 完整匹配的字符串 String repeatedPlan = matcher.group(1); // 重复的plan部分 String fiveDigits = matcher.group(2); // 5位数字部分 }
如果你确实需要用\p的字符类别语法
比如你想匹配某个Unicode字符类(比如任意字母)加上5位数字,那要修正\p的写法,示例如下:
// 匹配一个或多个任意字母 + 5位数字(全匹配场景) if(argIds.matches("\\p{Letter}+(\\d{5})")) { // ... }
内容的提问来源于stack exchange,提问作者Sašo Pavlič
相关产品推荐
相关产品推荐

