有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Java正则表达式特殊字符,直到字符串结束

给定的字符串规则是

[Random Nr of Letters]##[Random Nr of Letters]#[Random Nr of Letters]##########

字符串长度必须为35

我的绳子看起来像

TEST##TESTING#TEST#################

我的问题是我无法检测出错误的格式,比如

TEST##TESTING#TEST##A##############

我的方法是:

private static boolean test(String test_line) {
    String test = "[A-Z]{1,}##[A-Z]{1,}#[A-Z]{1,}#{1,}";
    Pattern test_pattern = Pattern.compile(test);
    Matcher matcher = test_pattern.matcher(test_line);
    return matcher.find();
}

是否有一个简单的正则表达式方法(我必须使用它),比如“用#结束这个字符串,并且不允许使用其他字符”

另一个问题: 我如何确保我的测试不允许使用A-Z 0-9和#以外的其他字符?比如:

    String test = "([^A-Z][^0-9][#])";
    Pattern test_pattern = Pattern.compile(test);
    Matcher matcher = test_pattern.matcher(test_line);
    return matcher.find();

(与谈判)

谢谢你的帮助:)


共 (4) 个答案

  1. # 1 楼答案

    对于指定的格式,确保最后一个字符为#

    ([A-Z]+[#]+){3}
    

    要测试字符串的长度,请执行以下操作:

    if(test.length == 35)
        // ...
    

    要测试并允许数字(仅字母数字和#符号):

    ([A-Z0-9]+[#]+){3}
    

    要同时允许小写字母,请执行以下操作:

    (\w+#+){3}
    
  2. # 2 楼答案

    试试这个

    [a-zA-Z]+#{2}[a-zA-Z]+#{1}[a-zA-Z]+#{1,}
    

    ^([a-zA-Z]+#{2}[a-zA-Z]+#{1}[a-zA-Z]+#{1,})$
    

    ^(?=.{35}$)([A-Z]+#{2}[A-Z]+#{1}[A-Z]+#{1,})$
    
    TEST##TESTING#TEST################# // pass
    TEST##TESTING#TEST##A############## // fail
    

    Demo

  3. # 3 楼答案

    让我们一步一步来:

    为了确保某些字符串具有特定的长度,正则表达式可以如下所示

    ^.{35}$
    

    在哪里

    • ^表示字符串的开头
    • .表示任何字符(除行分隔符外)
    • {35}表示前一个元素(在本例中为.-任何字符)可以出现的次数,因此这里regex需要35个字符
    • $表示字符串的结尾

    在您的例子中,您希望只接受范围为A-Z#的字符,这样您就可以用这个character-class{}替换.(任何字符),这样您的正则表达式看起来就像

    ^[A-Z#]{35}$
    

    但您还需要确保这些字符的顺序。换句话说,您还需要检查整个字符串是否与其他正则表达式匹配

    ^[A-Z]{1,}##[A-Z]{1,}#[A-Z]{1,}#{1,}$
    

    实际上,我们可以简单地使用+来代替{1,},这将给我们

    ^[A-Z]+##[A-Z]+#[A-Z]+#+$
    

    要组合这两个正则表达式,您可以使用look-ahead机制,让我们查看使用它的位置之后的字符,并检查它之后的字符是否与其他正则表达式匹配

    所以最后的正则表达式看起来像

    ^(?=[A-Z#]{35}$)[A-Z]+##[A-Z]+#[A-Z]+#+$
        ----------- ------------------------
    regex1 (length)  regex2 (order)
    

    现在,为了避免每次调用方法时重新编译(Pattern.compile(test))相同的正则表达式,最好将其编译后的版本存储在方法之外的类字段中。所以试试类似的东西

    private static Pattern test_pattern = Pattern
            .compile("^(?=[A-Z#]{35}$)[A-Z]+##[A-Z]+#[A-Z]+#+$");
    
    private static boolean test(String test_line) {
        return test_pattern.matcher(test_line).matches();
    }
    

    试验

    System.out.println(test("TEST##TESTING#TEST#################"));//true
    System.out.println(test("TEST##TESTING#TEST##A##############"));//false
    
  4. # 4 楼答案

    下面的正则表达式将匹配满足上述标准的行

    ^(?=.{35}$)[A-Z0-9]+##[A-Z0-9]+#[A-Z0-9]+#+$
    

    DEMO

    它与正好包含35个字符的行匹配