用于匹配法律标识符名称的正则表达式

时间:2012-09-22 19:46:54

标签: regex jflex

我对这个正则表达式事物有点新手。我正在尝试编写一个正则表达式来匹配遵循这些规则的标识符:

它必须以字母开头,并且只能包含字母,数字和下划线。标识符也必须以字母结尾,并且不得有两个连续的下划线。

我试图为此提出正则表达式,但我没有取得多大成功。我需要帮助。

2 个答案:

答案 0 :(得分:1)

使用正则表达式

\b[a-zA-Z](?:[a-zA-Z\d]|(?<!_)_(?!_))*[a-zA-Z]\b

如果您还要添加最小和最大长度(例如,最小6和最大12),请使用

\b(?=\w{6,12}\b)[a-zA-Z](?:[a-zA-Z\d]|(?<!_)_(?!_))*[a-zA-Z]\b

答案 1 :(得分:0)

以下是我可以做的示例

public static void main(String[] args) {
    System.out.println(test("a"));
    System.out.println(test("a_a"));
    System.out.println(test("a2_f"));
    System.out.println(test("a_2f"));
    System.out.println(test("a2_fasd"));
    System.out.println(test("dsads_dsadsa"));
    System.out.println(test("d_sads_dsads_a"));
    System.out.println(test("a2_3241_4324_2f"));
    //fails
    System.out.println(test("2_3241_4324_2f"));
    System.out.println(test("a2_3241__4324_2f"));
    System.out.println(test("_dsads_dsadsa"));
    System.out.println(test("dsads_dsadsa_"));
}

//validation
public static boolean test(String name) {
    String regEx = "^[a-zA-Z](_?[a-zA-Z0-9]+)*_?[a-zA-Z]$||^[a-zA-Z]([a-zA-Z0-9]+_?)*[a-zA-Z]$||^[a-zA-Z]_[a-zA-Z]$||^[a-zA-Z]$";
    return Pattern.matches(regEx, name);
}

------------------------
Printed results
true
true
true
true
true
true
true
true
false
false
false
false