すでにカンマで分割していて、取得した要素が数字かどうかを確認しようとすると、次の式を使用します^\d+(?:\.\d+)?$
:
これは と31
同様に一致しますが、orには一致し7.8
ません。2.
6 6 6 6
2m54
ここでは、その式の部分ごとの説明を示します。
^
意味: 一致は最初の文字から開始する必要があります
$
つまり、一致は最後の文字で終了する必要があるため、両方を合わせると、文字列全体が一致する必要があることを意味します
\d+
意味: 1 つ以上の数字
(?: ... )
?
量指定子を適用できる非キャプチャ グループです。
\.
意味: 文字通りのドット
(?:\.\d+)?
したがって、次のことを意味します: 少なくとも 1 つの数字が続くドットの 0 回または 1 回の出現
編集: 整数のみが必要な場合は、グループを削除してください: ^\d+$
-> 入力全体が 1 つ以上の数字である必要があります。
編集 2:入力文字列の前にコンマを追加できる場合(編集 4 を参照)、この正規表現を使用してすべての数値を取得できるはずです: (?<=,)\s*(\d+(?:\.\d+)?)\s*(?=,)
(整数のみの場合、その部分を削除する必要があります(?:\.\d+)?
)。
この式は、2 つのコンマの間のすべての数値を取得し、コンマと数値の間に空白を含めることができ、その数値をグループにキャッチします。6 6 6 6
これにより、またはの一致が防止され2m54
ます。次に、一致を反復処理してすべてのグループを取得します。
編集 3: 入力文字列の例を次に示します。
String input = "test\n" +
"t,b\n" +
"45,49\n" +
"31,34,38,34,56,23,,,,3,23,23653,3875,3.7,8.5,2.5,7.8,2., 6 6 6 6 ,\n" +
",\n" +
".\n" +
".,/;,jm.m.,,n ,sdsd, 3,2m54,2 4,2m,ar ,SSD A,,B,4D,CE,S4,D,2343ES,SD\n";
Pattern p = Pattern.compile( "(?<=,|\\n)\\s*(\\d+(?:\\.\\d+)?)\\s*(?=,|\\n)" );
Matcher m = p.matcher( input );
List<String> numbers = new ArrayList<String>();
while(m.find())
{
numbers.add( m.group( 1 ) );
}
System.out.println(Arrays.toString( numbers.toArray() ));
//prints: [45, 49, 31, 34, 38, 34, 56, 23, 3, 23, 23653, 3875, 3.7, 8.5, 2.5, 7.8, 3]
//removing the faction group: [45, 49, 31, 34, 38, 34, 56, 23, 3, 23, 23653, 3875, 3]
編集 4: 実際には、コンマを追加する必要はありません。次の式を使用するだけです。
`(?<=,|\n|^)\s*(\d+)\s*(?=,|\n|$)`
開始と終了のグループは、一致が入力の開始、コンマまたは改行に続き、入力の終了、コンマまたは改行が続く必要があることを意味します。