在Java中如何用正则表达式匹配“驼峰式命名法”?

7
String camelCasePattern = "([a-z][A-Z0-9]+)+";

boolean val = "camelCase".matches(camelCasePattern);
System.out.println(val);

以上输出为false。我试图匹配以小写字母开头的驼峰命名模式。虽然我尝试进行了一些调整,但仍然没有成功。这个驼峰命名模式有问题吗?


中间缺少了一个 + 吗? - devnull
因为您只是在每个匹配中测试第一个字符是否为小写。 - Hunter McMillen
7个回答

7
我会选择:
String camelCasePattern = "([a-z]+[A-Z]+\\w+)+"; // 3rd edit, getting better
System.out.println("camelCaseCaseCCase5".matches(camelCasePattern));

输出

true

您当前的Pattern匹配一个小写字母后面跟随零个或多个大写字母/数字,多次重复这种模式,这就是为什么它返回false的原因。


你仍然可以简化,通过将 0-9 替换为 \\d - Amit Joki
1
不符合“驼峰命名法”,但仍然可以使用 :) - Force444
1
@D.Singh和Amit,我微调了我的答案,这应该会稍微改善它。 - Mena
我不确定是否需要包含 (…) + - brillenheini

2

把一个单词规范为驼峰式命名(允许数字):

  • 必须以小写字母(a到z)开头
  • 不能有空格、标点符号或特殊字符
  • 最多只能有一个连续的大写字母
  • 可以以大写字母结尾
  • 可以包含数字0 - 9

此正则表达式支持所有这些要求:


String camelCasePattern = "^[a-z][a-z0-9]*(([A-Z][a-z0-9]+)*[A-Z]?|([a-z0-9]+[A-Z])*|[A-Z])$";

测试用例:https://regex101.com/library/8nQras

有关驼峰命名法和帕斯卡命名法的更多详细信息,请查看此存储库


2

匹配测试用例的最佳方式是:

String camelCasePattern = "^[a-z]+([A-Z][a-z0-9]+)+";

这将确保它以小写字母开头,然后有一个重复的模式,即一个大写字母,后跟一些小写字符。

匹配 camelCaseTest 但不匹配 camelCaseDOneWrong


2
假设"驼峰命名法单词"的定义如下:

"驼峰命名法单词"定义:

  • 仅包含大写和小写字母;[A-Za-z]
  • 必须以小写字母开头;[a-z]
  • 必须至少包含一个大写字母;[A-Z]
下面是一段经过完全注释的正则表达式Java程序,可能会有所帮助:
// TEST.java 20140529_0900
import java.util.regex.*;
public class TEST {
    public static void main(String[] args) {
        String data =   "This has one camelCase word."+
                        "This hasTwo camelCaseWords."+
                        "NON CamelCase withDigits123 words.";
        Pattern re_camel_case_word = Pattern.compile(
            "  # Match one camelCase word.\n" +
            "  \\b       # Anchor to word boundary.                    \n" +
            "  [a-z]+    # Begin with one or more lowercase alphas.    \n" +
            "  (?:       # One or more parts starting with uppercase.  \n" +
            "    [A-Z]   # At least one uppercase alpha                \n" +
            "    [a-z]*  # followed by zero or more lowercase alphas.  \n" +
            "  )+        # One or more parts starting with uppercase.  \n" +
            "  \\b       # Anchor to word boundary.",
            Pattern.COMMENTS);
        Matcher matcher = re_camel_case_word.matcher(data);
        while (matcher.find())
            System.out.println(matcher.group(0));
    }
}

请注意,根据此定义,数字和其他非字母字符是不允许的。为了适应其他“驼峰命名法”定义,模式需要进行修改。

1
我会选择 String camelCasePattern = "([a-z]+[a-zA-Z0-9]+)+";

0
尝试使用([a-z]+)([A-Z][a-z]*)*([a-z]+)([A-Z][a-z]+)*

0
^[a-z]+([A-Z][a-z0-9]+)*$

匹配成功: small smallLarge smallLargeLarge smallA1

未匹配成功: smallLARGE camelCaseDOneWrong camelCaseDWHDone


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接