1

私は正規表現を学んでいます。完全に初心者 :P

コンマのみで区切られている以下のデータから数値を分離したかった

test
t,b
45,49
31,34,38,34,56,23,,,,3,23,23653,3875,3.7,8.5,2.5,7.8,2., 6 6 6 6 ,
,
.
.,/;,jm.m.,,n ,sdsd, 3,2m54,2 4,2m,ar ,SSD A,,B,4D,CE,S4,D,2343ES,SD

フォーム テキスト フィールドから上記のデータを取得しているとします。今、コンマで区切られた数字であるデータのみを読みたい

解決策は[文字列]

45,49,31,34,38,34,56,23,3,23,23653,3875

他のすべてのデータはスキップする必要があります。私はこのようなことを試しました ^[0-9]+\,$

しかし、3.7 から 7、8.5 から 5 なども選択しています。

誰でもこれを解決するのを手伝ってくれますか!!

4

3 に答える 3

0

この式により、必要なすべての数値が得られます (数値のみで、カンマはありません)。

"^\d+|(?<=,)\d+$|(?<=,)\d+(?=,)"

grep の例を参照してください。

kent$  echo "31,34,38,34,56,23,,,,3,23,23653,3875,3.7,8.5,2.5,7.8,2., 6 6 6 6 ,
"|grep -oP "^\d+|(?<=,)\d+$|(?<=,)\d+(?=,)"

31
34
38
34
56
23
3
23
23653
3875
于 2011-09-26T15:54:16.427 に答える
0

すでにカンマで分割していて、取得した要素が数字かどうかを確認しようとすると、次の式を使用します^\d+(?:\.\d+)?$:

これは と31同様に一致しますが、orには一致し7.8ません。2.6 6 6 62m54

ここでは、その式の部分ごとの説明を示します。

  • ^意味: 一致は最初の文字から開始する必要があります
  • $つまり、一致は最後の文字で終了する必要があるため、両方を合わせると、文字列全体が一致する必要があることを意味します
  • \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|$)`

開始と終了のグループは、一致が入力の開始、コンマまたは改行に続き、入力の終了、コンマまたは改行が続く必要があることを意味します。

于 2011-09-26T15:45:52.500 に答える
0

私が思いついた最短の解決策は、コンマで区切られた一連の数字ではないものを空の文字列に置き換えることです。そのs.replaceAll("[^0-9]*,", ",")ため、そこにランダムな改行がある場合は、おそらくs.replaceAll("\n", ","). 次に、これらの変換の後、提案どおりに実行し、コンマで分割できます。

于 2011-09-26T15:51:48.287 に答える