1

これは、過去数日間私を夢中にさせてきました。レコードの検証とフィールドの抽出を同時に行うことで、一石二鳥です。私の戦略は、正規表現でこれを行うことでした:

private Pattern firstNumber = Pattern.compile("\\d{1}");

これは、「行(レコード)の最初の数字」を意味すると理解しています。これまでのところ、これは最初のフィールドを取得する (そしてそれが数値であることを確認する) のに効果的でしたが、さらに一歩進めたいと思います。

正規表現を微調整して、それが唯一のフィールドである場合にのみ数値が必要であることを指定するにはどうすればよいですか?

つまり、レコードが単に の場合は1010 を取得したいのですが、レコードが の場合は10 4何も取得したくありません (これはプロジェクトにとって無効なレコードであるため)。

私は試した:

private Pattern oneNumberOnly = Pattern.compile("\\d{1}\n");

しかし、残念なことに、これ (およびその他の順列) は数字を取得しません。私がここに欠けているものはありますか?

4

2 に答える 2

3

行/文字列の先頭を で、行/文字列^の末尾を で示すことができる$ので、パターンは次のようになります。

^\d+$

{1}、10 などの 1 桁以上のものを除外するため、機能しません\d+。を使用\dすると、小数と負の値も許可される場合があります (Java についてはわかりません)。数字だけが必要な場合は、に置き換え\dます[0-9]

{1}ちなみに、指定は常に冗長です。デフォルトでは、atom は一度だけ一致するからです。

于 2012-09-25T17:54:17.627 に答える
1

開始行文字と終了行文字を使用できます。独自の行にある番号を取得しようとしている場合は、次を使用できます。

Pattern.compile("^(\\d)++$");

{1} を追加すると、1 桁の数字しか得られません。また、比較対象の文字列をトリミングして、余分な空白を取り除く必要があります。

  • ^- 行頭文字
  • \\d- 数字 [0-9]
  • +- \d に一致する 1 つ以上の文字
  • +- 所有 (これはすべての数字を取得し、貪欲な量指定子よりも高速です)
  • $- 行末文字
于 2012-09-25T18:00:06.980 に答える