web-dev-qa-db-ja.com

文字列内の整数を検索する正規表現

Javaで正規表現を使用したいのですが。

私がやりたいのは、文字列の最初の整数を見つけることです。

例:

String = "the 14 dogs ate 12 bones"

14.を返します。

String = "djakld;asjl14ajdka;sdj"

14も返します。

これが今のところです。

Pattern intsOnly = Pattern.compile("\\d*");
Matcher makeMatch = intsOnly.matcher("dadsad14 dssaf jfdkasl;fj");
makeMatch.find();
String inputInt = makeMatch.group();
System.out.println(inputInt);

何が悪いのですか?

20
mscccc

0桁以上の数字を要求しています。 1つ以上要求する必要があります。

"\\d+"
50
Arkadiy

他のソリューションが_+/-_を処理できなかったようであり、_2e3_のようなケースがJava.lang.Integer.parseInt(String)でサポートされているため、問題に取り掛かります。私はある程度正規表現に不慣れなため、いくつかの間違いをしたり、Javaの正規表現パーサーがサポートしていないものを使用したり、過度に複雑にしたりした可能性がありますが、ステートメントは動作するようでした Kiki 0.5.6

すべての正規表現は、読み取り用のエスケープされていない形式と、Javaで文字列リテラルとして使用できるエスケープされた形式の両方で提供されます。

文字列からバイト、ショート、整数、またはロングを取得するには:

_unescaped: ([\+-]?\d+)([eE][\+-]?\d+)?
  escaped: ([\\+-]?\\d+)([eE][\\+-]?\\d+)?
_

...そしてボーナスポイントについて...

文字列からdoubleまたはfloatを取得するには:

_unescaped: ([\+-]?\d(\.\d*)?|\.\d+)([eE][\+-]?(\d(\.\d*)?|\.\d+))?
  escaped: ([\\+-]?\\d(\\.\\d*)?|\\.\d+)([eE][\\+-]?(\\d(\\.\\d*)?|\\.\\d+))?
_
3
bgw

PiPeepが言ったことに加えて、式内の整数を一致させようとしている場合、1 + 2 - 3123ではなく、1+ 2、および- 3にのみ一致するため、実際にはlookbehindステートメントを使用する必要があります。必要な部分は、実際にはMatcher.group(2)ではなくMatcher.group()によって返されます。

unescaped: ([0-9])?((?(1)(?:[\+-]?\d+)|)(?:[eE][\+-]?\d+)?)
  escaped: ([0-9])?((?(1)(?:[\\+-]?\\d+)|)(?:[eE][\\+-]?\\d+)?)

また、someNumber - 3someNumberが変数名など)の場合は、次のように使用できます。

unescaped: (\w)?((?(1)(?:[\+-]?\d+)|)(?:[eE][\+-]?\d+)?)
  escaped: (\\w)?((?(1)(?:[\\+-]?\\d+)|)(?:[eE][\\+-]?\\d+)?)

もちろん、The net change to blahblah was +4のような文字列を解析している場合は機能しません

0
AJMansfield

それらの1つを使用します。

Pattern intsOnly = Pattern.compile("[0-9]+");

または

Pattern intsOnly = Pattern.compile("\\d+");
0

Java仕様は、実際にはこのダブルスを解析するための正規表現のモンスターを提供します。ただし、意図したタイプで解析しようとしてエラーをキャッチするだけでも、少し読みやすい傾向があります。 。

DOUBLE_PATTERN = Pattern
        .compile("[\\x00-\\x20]*[+-]?(NaN|Infinity|((((\\p{Digit}+)(\\.)?((\\p{Digit}+)?)"
                + "([eE][+-]?(\\p{Digit}+))?)|(\\.((\\p{Digit}+))([eE][+-]?(\\p{Digit}+))?)|"
                + "(((0[xX](\\p{XDigit}+)(\\.)?)|(0[xX](\\p{XDigit}+)?(\\.)(\\p{XDigit}+)))"
                + "[pP][+-]?(\\p{Digit}+)))[fFdD]?))[\\x00-\\x20]*");
0
user3034617

ジェネリックでC#用に作成した便利なものを次に示します。正規表現に基づいて一致し、必要なタイプを返します。

public T[] GetMatches<T>(string Input, string MatchPattern) where T : IConvertible
    {
        List<T> MatchedValues = new List<T>();
        Regex MatchInt = new Regex(MatchPattern);

        MatchCollection Matches = MatchInt.Matches(Input);
        foreach (Match m in Matches)
            MatchedValues.Add((T)Convert.ChangeType(m.Value, typeof(T)));

        return MatchedValues.ToArray<T>();
    }

次に、数値のみを取得してstring []配列で返したい場合:

string Test = "22$data44abc";
string[] Matches = this.GetMatches<string>(Test, "\\d+");

うまくいけば、これは誰かにとって便利です...

0
Chris Smith