私はそのような文字列を持っているとしましょう:
eXamPLEstring>1.67>>ReSTOfString
私の仕事は、上記の文字列から 1.67 だけを抽出することです。
正規表現は便利だと思いますが、適切な式の書き方がわかりません。
私はそのような文字列を持っているとしましょう:
eXamPLEstring>1.67>>ReSTOfString
私の仕事は、上記の文字列から 1.67 だけを抽出することです。
正規表現は便利だと思いますが、適切な式の書き方がわかりません。
からすべてInt
のとを抽出したい場合は、私Float
のString
解決策に従うことができます:
private ArrayList<String> parseIntsAndFloats(String raw) {
ArrayList<String> listBuffer = new ArrayList<String>();
Pattern p = Pattern.compile("[0-9]*\\.?[0-9]+");
Matcher m = p.matcher(raw);
while (m.find()) {
listBuffer.add(m.group());
}
return listBuffer;
}
負の値も解析したい場合は[-]?
、次のようにパターンに追加できます。
Pattern p = Pattern.compile("[-]?[0-9]*\\.?[0-9]+");
,
また、セパレーターとしても設定したい場合は、次,?
のようにパターンに追加できます。
Pattern p = Pattern.compile("[-]?[0-9]*\\.?,?[0-9]+");
.
パターンをテストするには、次のオンライン ツールを使用できます: http://gskinner.com/RegExr/
注:このツールでは、私の例を試している場合は忘れずにエスケープしないでください(いずれかを外す必要があるだけです\
)
正規表現を使用して数字を一致させることができます
\\d+\\.\\d+
これは次のようになります
Pattern p = Pattern.compile("\\d+\\.\\d+");
Matcher m = p.matcher("eXamPLestring>1.67>>ReSTOfString");
while (m.find()) {
Float.parseFloat(m.group());
}
これを1行で行う方法は次のとおりです。
String f = input.replaceAll(".*?([\\d.]+).*", "$1");
実際に が必要な場合はfloat
、次のように 1 行で行います。
float f = Float.parseFloat(input.replaceAll(".*?([\\d.]+).*", "$1")),
String s = "eXamPLestring>1.67>>ReSTOfString>>0.99>>ahgf>>.9>>>123>>>2323.12";
Pattern p = Pattern.compile("\\d*\\.\\d+");
Matcher m = p.matcher(s);
while(m.find()){
System.out.println(">> "+ m.group());
}
フロートのみを与える
>> 1.67
>> 0.99
>> .9
>> 2323.12
正規表現を使用できます\d*\.?,?\d*
これは、1.0や1,0などのフロートで機能します
/**
* Extracts the first number out of a text.
* Works for 1.000,1 and also for 1,000.1 returning 1000.1 (1000 plus 1 decimal).
* When only a , or a . is used it is assumed as the float separator.
*
* @param sample The sample text.
*
* @return A float representation of the number.
*/
static public Float extractFloat(String sample) {
Pattern pattern = Pattern.compile("[\\d.,]+");
Matcher matcher = pattern.matcher(sample);
if (!matcher.find()) {
return null;
}
String floatStr = matcher.group();
if (floatStr.matches("\\d+,+\\d+")) {
floatStr = floatStr.replaceAll(",+", ".");
} else if (floatStr.matches("\\d+\\.+\\d+")) {
floatStr = floatStr.replaceAll("\\.\\.+", ".");
} else if (floatStr.matches("(\\d+\\.+)+\\d+(,+\\d+)?")) {
floatStr = floatStr.replaceAll("\\.+", "").replaceAll(",+", ".");
} else if (floatStr.matches("(\\d+,+)+\\d+(.+\\d+)?")) {
floatStr = floatStr.replaceAll(",", "").replaceAll("\\.\\.+", ".");
}
try {
return new Float(floatStr);
} catch (NumberFormatException ex) {
throw new AssertionError("Unexpected non float text: " + floatStr);
}
}
このリンクを見てください。また、そのような正規表現を作成するときに留意する必要があるいくつかのことについても説明しています。
[-+]?[0-9]*\.?[0-9]+
コード例:
String[] strings = new String[3];
strings[0] = "eXamPLestring>1.67>>ReSTOfString";
strings[1] = "eXamPLestring>0.57>>ReSTOfString";
strings[2] = "eXamPLestring>2547.758>>ReSTOfString";
Pattern pattern = Pattern.compile("[-+]?[0-9]*\\.?[0-9]+");
for (String string : strings)
{
Matcher matcher = pattern.matcher(string);
while(matcher.find()){
System.out.println("# float value: " + matcher.group());
}
}
出力:
# float value: 1.67
# float value: 0.57
# float value: 2547.758