Java正则表达式-字符串结束前的特殊字符
给定的字符串规则是Java正则表达式-字符串结束前的特殊字符,java,regex,replace,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 tes
[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();
(与谈判)
谢谢你的帮助:)试试这个
[a-zA-Z]+#{2}[a-zA-Z]+#{1}[a-zA-Z]+#{1,}
或
或
下面的正则表达式将匹配满足上述标准的行
^(?=.{35}$)[A-Z0-9]+##[A-Z0-9]+#[A-Z0-9]+#+$
它与正好包含35个字符的行匹配。对于指定的格式,确保最后一个字符是
\
:
要测试字符串的长度,请执行以下操作:
if(test.length == 35)
// ...
要测试并允许数字(仅字母数字和#
符号):
要同时允许小写字母,请执行以下操作:
(\w+#+){3}
让我们一步一步来: 为了确保某些字符串具有特定的长度,正则表达式可以如下所示
^.{35}$
^[A-Z#]{35}$
^(?=[A-Z#]{35}$)[A-Z]+##[A-Z]+#[A-Z]+#+$
----------- ------------------------
regex1 (length) regex2 (order)
在哪里
表示字符串的开头^
表示任何字符(除行分隔符外)
表示前一个元素(在本例中为{35}
-任何字符)可以出现的次数,因此这里regex需要35个字符
表示字符串的结尾$
A-Z
和#
中的字符,这样您就可以用这个[A-Z#]
替换
(任何字符),这样您的正则表达式看起来就像
^.{35}$
^[A-Z#]{35}$
^(?=[A-Z#]{35}$)[A-Z]+##[A-Z]+#[A-Z]+#+$
----------- ------------------------
regex1 (length) regex2 (order)
但您还需要确保这些字符的顺序。换句话说,您还需要检查整个字符串是否与其他正则表达式匹配
^[A-Z]{1,}##[A-Z]{1,}#[A-Z]{1,}#{1,}$
实际上,我们可以简单地使用+
而不是{1,}
,这将为我们提供
^[A-Z]+##[A-Z]+#[A-Z]+#+$
要组合这两个正则表达式,您可以使用一种机制,让我们可以查看使用它的位置之后的字符,并检查它之后的字符是否与其他正则表达式匹配
所以最后的正则表达式看起来像
^.{35}$
^[A-Z#]{35}$
^(?=[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();
}
试验
你的意思是?
{1,}
相当于+
@nickb谢谢,我知道:)只是想保持不变structure@hex494D49输入长度必须为35个字符。@AvinashRaj谢谢你,你可以看到OP每十秒钟编辑一次问题;){1,}
相当于+
@AvinashRaj+1,因为您的评论在我回答之前几秒钟;)