Java 如何使用“matches()”方法查看字符串是否与格式匹配
我目前正在做一件事,代码可以输入数千行字符串。每行必须遵循如下特定格式:Java 如何使用“matches()”方法查看字符串是否与格式匹配,java,regex,string,Java,Regex,String,我目前正在做一件事,代码可以输入数千行字符串。每行必须遵循如下特定格式: if (line.matches(".*[a-zA-z].*,([0-9]|10),([0-9]|10),([0-9]|10),([0-9]|10),([0-9]|10),([0-9]|10)")) { System.out.println("no"); } else { System.out.println(line); 姓名 其中“name”是一部电影的名称,我们可以假设该名称没有任何数字,是
if (line.matches(".*[a-zA-z].*,([0-9]|10),([0-9]|10),([0-9]|10),([0-9]|10),([0-9]|10),([0-9]|10)")) {
System.out.println("no");
}
else {
System.out.println(line);
姓名
其中“name”是一部电影的名称,我们可以假设该名称没有任何数字,是0-10之间的任何数字。每个值必须用逗号分隔
我的代码如下:
if (line.matches(".*[a-zA-z].*,([0-9]|10),([0-9]|10),([0-9]|10),([0-9]|10),([0-9]|10),([0-9]|10)")) {
System.out.println("no");
}
else {
System.out.println(line);
问题是电影的标题不能有逗号。如果是,则需要打印。然而,我的“匹配项”似乎没有选择标题中有逗号的行。在我看来,我的代码特别指出,如果下一个由逗号分隔的条目不是整数,那么它就不匹配,因此需要打印“行”
有人能看出我在这方面的错误吗?问题在于。*。这部分可以包含逗号 星期五,dayaervsere,6,4,78,7 ^ .[a-zA-Z],…] 所以,基本上,你只需要把它去掉。相反,对第一组应用量词:
[a-zA-Z]* // to match any number of characters
或
如果您确实使用正则表达式来解决这个问题,我建议在正则表达式的“名称”部分使用逗号。重点确保有6个数字,每个数字后面有一个逗号。您可以稍后检查名称是否符合适当的条件
import java.util.regex.Pattern;
import java.util.regex.Matcher;
// before your for-loop, create a pattern (Assuming no digits in title)
Pattern p = Pattern.compile("([^0-9]+),([0-9]|10),([0-9]|10),([0-9]|10),([0-9]|10),([0-9]|10),([0-9]|10)");
// ...
// later on in your actual for-loop for each line.
Matcher m = p.matcher(line);
if (m.matches())
{
String title = m.group(1);
// do extra checking for the title if needed
}
else
{
// print no
}
你是说规则是: 行必须是7个逗号分隔的值:一个名称和6个0-10范围内的数字。 名称不能包含逗号。 我们可以假设名称没有任何数字,但这不是一个不能的要求。 由于名称中唯一的无效字符是逗号,因此正则表达式应为: [^,]*,?:[0-9]| 10,:[0-9]| 10,:[0-9]| 10,:[0-9]| 10,:[0-9]| 10,:[0-9]| 10 如果要捕获字段,请使用以下代码:
Pattern p = Pattern.compile("([^,]*),([0-9]|10),([0-9]|10),([0-9]|10),([0-9]|10),([0-9]|10),([0-9]|10)");
for (String line : lines) {
Matcher m = p.matcher(line);
if (! m.matches()) {
System.out.println("Invalid line: " + line);
} else {
System.out.println("Name: " + m.group(1));
System.out.println(" Values: " + m.group(2)
+ " " + m.group(3)
+ " " + m.group(4)
+ " " + m.group(5)
+ " " + m.group(6)
+ " " + m.group(7));
}
}
试验
输出
无效行:水牛比尔和印第安人,或坐牛的历史课,0,1,2,3,4,5
姓名:Dr.Strangelove或:我是如何学会停止担忧,爱上炸弹的
数值:678910 0
姓名:300
数值:123456
第一部电影的名字有个逗号,所以不匹配。
第二部电影的名字有特殊的角色。和:,但没有逗号,因此匹配。
第三个电影名称是,这是一部真实的电影,因此它匹配。以下正则表达式应该可以解决您的问题:
^([a-zA-Z ]+),([0-9]|10),([0-9]|10),([0-9]|10),([0-9]|10),([0-9]|10),([0-9]|10)
或者它的较短版本,没有代码重复:
^([a-zA-Z ]+)(,([0-9]|10)){6}
测试
杀手,6,7,3,6,8,1符合模式
杀戮,呃,6,7,3,6,8,1不符合你想要的模式
此外,还支持标题中的空格
你可以玩玩。对不起,从最后一段我想不出你的确切要求。如果标题中有逗号,是否匹配?你能提供一个你的程序输入/输出的例子,以及你期望的结果吗?名字不能有数字,但可以有逗号,普通格式的逗号出现在名字后面,后面跟着一个数字。因此,您需要检查逗号的第一个实例,后跟数字,然后是regexHi的其余部分,很抱歉,这里的内容含糊不清。如果标题中有逗号,则不应匹配。有数千行正在输出。例如,应该输出但不输出的内容是Fri,day,4,6,2,4,7,9,这不应该匹配。这行定义没有多大意义。分隔符应该是唯一的,不应显示为数据。电影标题中不能有逗号。如果有,就需要打印那么它需要打印还是忽略呢?这很好,但是空格和撇号都是允许的。这只是逗号,因为它们分隔了每个不允许的条目。有没有其他方法可以解释这个问题?@rexorsist您现在可以在第一组中处理这个问题。例如,要允许空间,只需在其中添加一个空间;或者只允许使用逗号,使用[^,]等等。仅注意转义有意义的模式字符,如中定义的…。此操作100%完美。非常感谢你。我是java的完全初学者。你能把你写的正则表达式分解一下吗?我真的只是想了解更多,比如[^,]需要什么,或者为什么在整数之前有一个“?”。谢谢again@rexorsist的javadoc列出了所有正则表达式构造。另见:
^([a-zA-Z ]+)(,([0-9]|10)){6}