文字列に数値Javaが含まれているかどうかを確認する


102

ユーザーが次の形式で文字列を入力するプログラムを書いています。

"What is the square of 10?"
  1. 文字列に数字があることを確認する必要があります
  2. 数だけを抽出します。
  3. .contains("\\d+")またはを使用する.contains("[0-9]+")と、プログラムは文字列内の数値を見つけることができません。入力が何で.matches("\\d+")あっても、数値しか存在しない場合にのみ機能します。

検索と抽出のソリューションとして何を使用できますか?


入力文字列から数字だけでなく、最初の数値を抽出する場合は、私の答えを参照してください。
Sajal Dutta 2013

回答:


229

これを試して

str.matches(".*\\d.*");

2
二重のバックスラッシュは何をしますか?
ankit

15
説明すると:。*は0から無限出現までの任意の文字を意味し、\\ d +(2番目のバックスラッシュをエスケープするためだけの二重円記号)を意味し、\ d +は1回から無限までの数字を意味します。
Giudark 2016

6
エイリアンの魔法ではありません。暗号化されたBSです。誰もこれを行うことができなかった時代から戻ってきましたが、それを考案したエンジニアは基本的に秘密のコードなので、共有するまでは作成者だけが知っています。
JamisonMan111

修正されました。1桁しか存在しない場合、解は十分に良いため、この場合は1桁以上必要はありません。
Yassin Hajaj

26

入力文字列から最初の数値を抽出したい場合は、

public static String extractNumber(final String str) {                
    
    if(str == null || str.isEmpty()) return "";
    
    StringBuilder sb = new StringBuilder();
    boolean found = false;
    for(char c : str.toCharArray()){
        if(Character.isDigit(c)){
            sb.append(c);
            found = true;
        } else if(found){
            // If we already found a digit before and this char is not a digit, stop looping
            break;                
        }
    }
    
    return sb.toString();
}

例:

入力「123abc」の場合、上記のメソッドは123を返します。

「abc1000def」の場合、1000。

「555abc45」の場合、555。

「abc」の場合、空の文字列を返します。


11

正規表現よりも速いと思います。

public final boolean containsDigit(String s) {
    boolean containsDigit = false;

    if (s != null && !s.isEmpty()) {
        for (char c : s.toCharArray()) {
            if (containsDigit = Character.isDigit(c)) {
                break;
            }
        }
    }

    return containsDigit;
}

抽出が表示されなかったのは残念です。string内の数値を抽出する場合は、このコードを簡単に編集できます。
MelihAltıntaş2013

10

s=s.replaceAll("[*a-zA-Z]", "") すべてのアルファベットを置き換える

s=s.replaceAll("[*0-9]", "") すべての数値を置き換えます

2つ以上の置換を行うと、すべての特殊文字列が取得されます

から整数のみを抽出したい場合 String s=s.replaceAll("[^0-9]", "")

からアルファベットだけを抽出したい場合 String s=s.replaceAll("[^a-zA-Z]", "")

幸せなコーディング:)


10

正しいパターンが1つも見つかりませんでした。小さくて甘い解決策については、以下のガイドに従ってください。

String regex = "(.)*(\\d)(.)*";      
Pattern pattern = Pattern.compile(regex);
String msg = "What is the square of 10?";
boolean containsNumber = pattern.matcher(msg).matches();

これは本当にうまくいきます。注意が必要なのは、文字列にバックスラッシュが含まれている場合だけです。もしそうなら、これは「違法なエスケープ文字」エラーを生成すると思います。
w3bshark 2017

これは最高です
ヤシュウィンマンサドワラ

9

以下のコードは、「Javaで文字列に数値が含まれているかどうかを確認する」のに十分です

Pattern p = Pattern.compile("([0-9])");
Matcher m = p.matcher("Here is ur string");

if(m.find()){
    System.out.println("Hello "+m.find());
}

8
Pattern p = Pattern.compile("(([A-Z].*[0-9])");
Matcher m = p.matcher("TEST 123");
boolean b = m.find();
System.out.println(b);

3
最初の行に軽微なエラーがあります。文字列にブラケットがありません。パターンp = Pattern.compile( "(([[AZ]。* [0-9]))");
Gaurav Tyagi 2018年

また、これは機能しません...テストは機能しますが、123TESTは機能しません。
fergal_dd


6

私が行った解決策は次のようになります:

Pattern numberPat = Pattern.compile("\\d+");
Matcher matcher1 = numberPat.matcher(line);

Pattern stringPat = Pattern.compile("What is the square of", Pattern.CASE_INSENSITIVE);
Matcher matcher2 = stringPat.matcher(line);

if (matcher1.find() && matcher2.find())
{
    int number = Integer.parseInt(matcher1.group());                    
    pw.println(number + " squared = " + (number * number));
}

私はそれが完璧な解決策ではないと確信していますが、それは私のニーズに適していました。助けてくれてありがとう。:)


1

あなたはこれを試すことができます

String text = "ddd123.0114cc";
    String numOnly = text.replaceAll("\\p{Alpha}","");
    try {
        double numVal = Double.valueOf(numOnly);
        System.out.println(text +" contains numbers");
    } catch (NumberFormatException e){
        System.out.println(text+" not contains numbers");
    }     

1

数値を探すだけでなく、それを抽出したいので、それを行う小さな関数を書くべきです。あなたが数字を見つけるまで、文字ごとに行きます。ああ、ちょうどstackoverflowであなたのために必要なコードを見つけました:stringで整数を見つけてください。受け入れられた答えを見てください。


1
public String hasNums(String str) {
        char[] nums = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' };
        char[] toChar = new char[str.length()];
        for (int i = 0; i < str.length(); i++) {
            toChar[i] = str.charAt(i);
            for (int j = 0; j < nums.length; j++) {
                if (toChar[i] == nums[j]) { return str; }
            }
        }
        return "None";
    }


0

ASCIIはUNICODEの先頭にあるため、次のようなことができます。

(x >= 97 && x <= 122) || (x >= 65 && x <= 90) // 97 == 'a' and 65 = 'A'

あなたは他の値を理解できると確信しています...

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.