^[A-Z](([A-Z_0-9])*[^_])?$ 错误匹配
^[A-Z](([A-Z_0-9])*[^_])?$ wrong match
需要 Java 通用类型参数的正则表达式,所以我尝试使用 :
^[A-Z](([A-Z_0-9])*[^_])?$
意味着类型名称应该有1个或多个字符,全部大写和数字,这是可能的
使用'_'作为分隔符,但不在末尾,f.e。 'TT_A9'
但令我惊讶的是,我的正则表达式工具显示 'Aa' 或 'AAa' 或 'AA-'
的匹配项
我写了一个简单的测试 class 来检查 :
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegexTestPatternMatcher {
public static final String test = "AA-";
public static void main(String[] args) {
Pattern pattern = Pattern.compile("^[A-Z](([A-Z_0-9])*[^_])?$");
Matcher matcher = pattern.matcher(test);
System.out.println("Matches ? " + matcher.matches());
}
}
输出:
AA- Matches ? true
AAa也是如此,但AA_却不是
如果我使用正则表达式 ^[A-Z](([A-Z_0-9])*[^_a-z-])?$
它会起作用
但我不明白为什么我需要使用 'a-z' 和 '-' 作为排除项,
当我只查找大写字符时 !?
当使用 negated character class 时 - 在您的原始模式中,[^_]
- 您告诉正则表达式使用 class 中定义的字符以外的字符。所以,你的正则表达式实际上需要至少 2 个字符,第一个是大写的 ASCII 字母,最后是 _
以外的任何字符,_
、[=14 中可以有任何字符=] 和 A-Z
介于两者之间。
您正在寻找锚定在字符串末尾的 negative lookbehind:
^[A-Z][A-Z_0-9]*$(?<!_)
^^^^^^
查看 regex demo
它将使所有 _
位于字符串末尾的匹配失败。 _
不会被消耗,它只会被检查是否存在,因此该模式将接受(匹配)一个以大写 ASCII 字母开头的 1 个字符的字符串,并且可以选择后跟 [ 中定义的范围内的字符=18=] 字符 class.
我还建议删除所有冗余分组(无论如何您都不会使用捕获的潜台词)。
需要 Java 通用类型参数的正则表达式,所以我尝试使用 :
^[A-Z](([A-Z_0-9])*[^_])?$
意味着类型名称应该有1个或多个字符,全部大写和数字,这是可能的
使用'_'作为分隔符,但不在末尾,f.e。 'TT_A9'
但令我惊讶的是,我的正则表达式工具显示 'Aa' 或 'AAa' 或 'AA-'
的匹配项
我写了一个简单的测试 class 来检查 :
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegexTestPatternMatcher {
public static final String test = "AA-";
public static void main(String[] args) {
Pattern pattern = Pattern.compile("^[A-Z](([A-Z_0-9])*[^_])?$");
Matcher matcher = pattern.matcher(test);
System.out.println("Matches ? " + matcher.matches());
}
}
输出:
AA- Matches ? true
AAa也是如此,但AA_却不是
如果我使用正则表达式 ^[A-Z](([A-Z_0-9])*[^_a-z-])?$
它会起作用
但我不明白为什么我需要使用 'a-z' 和 '-' 作为排除项,
当我只查找大写字符时 !?
当使用 negated character class 时 - 在您的原始模式中,[^_]
- 您告诉正则表达式使用 class 中定义的字符以外的字符。所以,你的正则表达式实际上需要至少 2 个字符,第一个是大写的 ASCII 字母,最后是 _
以外的任何字符,_
、[=14 中可以有任何字符=] 和 A-Z
介于两者之间。
您正在寻找锚定在字符串末尾的 negative lookbehind:
^[A-Z][A-Z_0-9]*$(?<!_)
^^^^^^
查看 regex demo
它将使所有 _
位于字符串末尾的匹配失败。 _
不会被消耗,它只会被检查是否存在,因此该模式将接受(匹配)一个以大写 ASCII 字母开头的 1 个字符的字符串,并且可以选择后跟 [ 中定义的范围内的字符=18=] 字符 class.
我还建议删除所有冗余分组(无论如何您都不会使用捕获的潜台词)。