21

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);

私は何を間違っていますか?

4

6 に答える 6

52

0桁以上を求めています。1 つ以上を要求する必要があります。

"\\d+"
于 2008-12-16T18:08:23.547 に答える
3

他の解決策が処理に失敗したようで、 の+/-ようなケース2e3java.lang.Integer.parseInt(String)サポートされているようです。そのため、問題に取り組みます。私は正規表現に少し慣れていないので、いくつかの間違いを犯したり、Java の正規表現パーサーがサポートしていないものを使用したり、過度に複雑にしたりした可能性がありますが、ステートメントはKiki 0.5.6で機能するように見えました。

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

文字列から byte、short、int、または long を取得するには:

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+))?
于 2010-09-10T21:23:20.233 に答える
0

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

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

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

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

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

于 2012-12-20T19:11:16.770 に答える
0

Java 仕様は、実際には double を解析するための正規表現のこの怪物を提供します。ただし、意図した型で解析しようとしてエラーをキャッチするだけで、少し読みやすくなる傾向があるため、悪い習慣と見なされます。

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]*");
于 2016-09-02T19:24:54.717 に答える
0

Heres は、ジェネリックを使用して 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+");

うまくいけば、これは誰かに役立ちます...

于 2009-10-22T20:08:14.610 に答える