簡體   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