Java RegEx - 特殊字符直到字符串结尾

时间:2014-07-29 16:16:43

标签: java regex replace

鉴于字符串的规则是

[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();
}

使用RegEx是否有一个简单的方法(我必须使用它),例如"用#结束此字符串并且不要允许其他字符"。

另一个问题: 我怎样才能确保我的测试不会允许其他字符而不是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 个答案:

答案 0 :(得分:2)

让我们一步一步地做:

为了确保某些字符串具有特定长度,正则表达式可能看起来像

^.{35}$

其中

  • ^表示字符串的开头
  • .表示任何字符(在行分隔符旁边)
  • {35}表示前一个元素(不包括. - 任何字符)可以出现的次数,因此此处正则表达式需要35个字符
  • $表示字符串结尾

在您的情况下,您只想接受A-Z#范围内的字符,因此您可以使用character-class .替换[A-Z#](任何字符)所以你的正则表达式看起来像

^[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

答案 1 :(得分:1)

试试这个

[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

答案 2 :(得分:1)

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

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

DEMO

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

答案 3 :(得分:0)

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

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

测试字符串的长度:

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

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

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

允许使用小写字母:

(\w+#+){3}