Java正则表达式 - 特殊字符直到字符串结尾

3

给出字符串的规则如下:

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

(带有谈判)
感谢您的帮助 :)

你是指这个 http://regex101.com/r/jV9lQ9/2 吗? - Avinash Raj
4个回答

3
让我们一步步来:
为了确保某个字符串具有特定的长度,正则表达式可以如下所示:

/^.{n}$/

^.{35}$

在这里:

  • ^ 表示字符串的开头
  • . 表示任意字符(除了换行符)
  • {35} 表示前面的元素(在我们的例子中是 . - 任意字符)可以出现多少次,因此这个正则表达式要求有 35 个字符
  • $ 表示字符串的结尾

在您的情况下,您只想接受范围内的字母 A-Z 和符号 #,所以您可以将 .(任意字符)替换为这个字符类 [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
尝试一下:

试试这个

[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

演示


{1,} 相当于 + - nickb
@nickb 谢谢,我知道 :) 只是想保持相同的结构。 - hex494D49
@hex494D49 输入必须为35个字符长。 - Avinash Raj
@AvinashRaj 谢谢你,伙计 :) 你看到了吗,原帖每十秒钟就会被编辑一次 ;) - hex494D49

1
下面的正则表达式将匹配满足上述条件的行,
^(?=.{35}$)[A-Z0-9]+##[A-Z0-9]+#[A-Z0-9]+#+$

演示

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


1
{1,} 相当于 + - nickb
@AvinashRaj +1 因为你的评论比我的回答早几秒钟 ;) - hex494D49

0

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

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

测试字符串的长度:

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

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

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

为了允许小写字母:

(\w+#+){3}

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