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}