繁体   English   中英

如何检查字符串是否包含 3 位或更多位

[英]How to check if a String contains 3 digits or more

我目前正在尝试检查字符串是否包含 3 位或更多位。 如果是,那么它是有效的。 我该如何解决?

System.out.print("Enter a string: ");  //111Hello <-- valid
String word = input.nextLine();
boolean numbers = word.matches(".*\\d{3,}"); 
System.out.println(numbers);

Output:

Invalid

这里有些例子:

输入: Hello244

Output: Valid

输入: 3Hello

Output: Invalid

输入: 6Hello2Hello5

Output: Valid

使用正则表达式很容易做到这一点,因为包含至少三位数字的字符串集是一种正则语言- 正是正则表达式旨在识别的内容。

public boolean hasThreeDigits(String s) {
    return s.matches(".*\\d.*\\d.*\\d.*");
}

正则表达式.*\d.*\d.*\d.*将三位数字与之前、之后或之间的任何内容匹配。

为什么不设置一个计数器并遍历每个字符,然后测试它是否为数字?

这是伪代码:

System.out.print("Enter a string: ");  //111Hello <-- valid
String word = input.nextLine();
int numberOfDigits = countDigits(word, 3);
if (numberOfDigits) >= 3{//...

int countDigits(String val, int max){
    int cnt = 0;
    for(int i =0; i < val.length(); i++){
        char c = val.charAt(i);
        if(Character.isDigit(c){
            cnt++;
        }
        if(cnt == max)return;
    }
    return cnt;
}

https://docs.oracle.com/javase/7/docs/api/java/lang/Character.html#isDigit(char)

让我们用正则表达式来做这件事。 这似乎不是必需的,但让我们假设这是一个作业:

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class FindDigits {
    public static final Pattern DIGIT_PATTERN = Pattern.compile("\\p{Digit}");

    private static int countDigits(String input) {
        final Matcher m = DIGIT_PATTERN.matcher(input);
        int c = 0;
        while (m.find()) {
            c++;
        }
        return c;
    }

    public static void main(String[] args) {
        for (int i = 0; i < args.length; i++) {
            final int c = countDigits(args[i]);
            System.out.printf("Input : \"%s\"%nOutput: %s%n", args[i], c >= 3 ? "Valid" : "Invalid");
        }
    }
}

这个答案假设输入是命令行上的一组字符串。 它定义了一个 function 来计算由单个数字组成的模式的出现次数。 它当然可以在 3 时停止计数。

我主要发布这个是因为Matcher.find经常被忽视,因为它没有在String中定义的便利方法。 它通常使阅读正则表达式变得更加容易,因为您不需要定义您不需要的内容。 否则你会被正则表达式字符串困住,例如".*\\d.*\\d.*\\d.*"这有点可怕并且不能很好地扩展。


除了 while 循环,您还可以在 Java 运行时的更高版本上使用m.results().count() 在这种情况下,单线将是:

long count = Pattern.compile("\\p{Digit}").matcher(input).results().count();

也许不是最优雅的解决方案,但非常简短明了:

System.out.println(input.replaceAll("\\D","").length() > 2);

我最喜欢kaya3的解决方案

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM