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);
何が悪いのですか?
0桁以上の数字を要求しています。 1つ以上要求する必要があります。
"\\d+"
他のソリューションが_+/-
_を処理できなかったようであり、_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+))?
_
PiPeepが言ったことに加えて、式内の整数を一致させようとしている場合、1 + 2 - 3
は1
、2
、3
ではなく、1
、+ 2
、および- 3
にのみ一致するため、実際にはlookbehindステートメントを使用する必要があります。必要な部分は、実際にはMatcher.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
のような文字列を解析している場合は機能しません
それらの1つを使用します。
Pattern intsOnly = Pattern.compile("[0-9]+");
または
Pattern intsOnly = Pattern.compile("\\d+");
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]*");
ジェネリックで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+");
うまくいけば、これは誰かにとって便利です...