Java正则表达式验证最后两个字符

3

我想验证一个表达式,虽然我已经能够实现90%,但是有一个条件无法通过。我们如何添加一个表达式来确保在一些字符后的特定字符应该是字母,接下来如果出现任何字符则应该是数字。

Eg: [A-Z1-9]{1,30}?[A-Z]{0,1}$[1-9]{0,1}

该模式最多可有32个字符,最后2个字符是可选的。 如果字符超过30个,则应以字母[A-Z]开头,并且只能出现一次{0,1} 而第32个字符应该是数字[1-9],只能出现一次,并且仅在31个字符存在时才应出现。 请问我能帮您做些什么?


重述:您的字符串将有30或32个字符长。如果它是32个字符长,则第31个字符将是大写字母,第32个字符将是一个数字? - Duncan Jones
如果您能提供匹配失败的示例字符串,那就太好了。请附上示例以便更好地理解问题。 - Ankur Shanbhag
使用Java特性代替正则表达式怎么样? - Marco Acierno
@邓肯:是的,那就是要求。 - Prasobh.Kollattu
@Prasobh.K 字符串的长度是否可以是1-29个字符?还是它们总是只有30或32个字符? - Duncan Jones
2个回答

4
尝试以下模式,它匹配1-29个“常规”字符或者恰好30个字符,并带有可选的后缀。
//                  Matches 29 chars    Matches 30 chars plus suffix
//                        |                      |
//                ----------------------------------------------
//                |               ||                           |
String pattern = "([A-Z\\d]{1,29})|([A-Z\\d]{30}([A-Z]\\d){0,1})";
//                 ^^^^^^^^         ^^^^^^^^

下划线部分(^^^^)应该被调整以描述你允许在前30个字符中使用的字符集。

注意:我使用0-9作为有效数字,这更常见。如果你真的需要1-9,你可以调整代码。


那个后缀只有1个字符长,你不会匹配32个字符。 - RokL
@UMad 后缀是两个字符:[A-Z]\\d。试一下吧 :-) - Duncan Jones
这对我有所帮助,但我需要更改模式,例如String pattern =“([A-Z \ d] {1,29})|([A-Z \ d] {30}([A-Z] {0,1} \ d {0,1})”; 因为最后两个字符是可选的。 - Prasobh.Kollattu
@Prasobh.K 我的模式完全符合您的要求。您说有效字符串长度为30或32。您刚发布的模式将允许31个字符。 - Duncan Jones
不确定您是否需要区分29个字符和30个字符以上的情况。一个单一的模式 [A-Z\\d]{1,30}([A-Z]\\d){0,1} 可以匹配相同的字符串。此外,当不需要捕获组时,我倾向于使用 (?:...) 而不是 (....) - RokL
@UMad 关于不同的情况,你在这种情况下可能是正确的。这取决于字符1-29中允许的字符是否与两个可选字符完全匹配。就像所有正则表达式问题一样,解释并不好。感谢您关于非捕获组的建议,我会研究一下。 - Duncan Jones

1
你的文本不够清晰。如果第31个字符存在,那么第32个字符是可选还是必须的?
这个正则表达式允许30个字符、31个字符或32个字符。
这个正则表达式允许30个字符或32个字符(即如果第31个字符存在,则第32个字符是必需的)。

31和32个字符是可选的。如果存在第32个字符,则它应该是一个数字,而第31个字符应该是字母,反之亦然。 - Prasobh.Kollattu

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