0

I have to validate a String against a regular expression for a date format YYYYMMddhhmmss.

I have tested the below code:

temp=echo $file_timestamp | egrep '^(20)[0-9][0-9](0[1-9]|1[012])(0[1-9]|[12][0-9]|3[01])(0[0-9]|1[0-9]|2[0123])([0-5])[0-9]([0-5])[0-9]$';

The following returns the content of file_timestamp if it satisfies the pattern, else returns null to the variable temp.

Is this code snippet optimized per unix standard?

4

1 に答える 1

0

あなたの質問に明示的に対処するUNIX標準はありません。

また、標準と適切に機能するコードが対立することもあります (それほど頻繁ではありません)。

コードに関する少なくとも 3 つの問題を考えることができます。reg 式も含めて、開発者としてカバーしたいと考えています。

  1. 結果は正しいですか?これを知ることができるのはあなただけです。テスト駆動開発としてコードを構築することは、Java の専門家だけができることではありません。サポートする必要があると思われる入力の範囲でファイルを作成し、すべてのケースで出力が機能することを確認します。また、これが本当に大きなプロジェクトである場合は、処理されなかったものを示すエラー メッセージを表示します。

  2. メンテナンス可能ですか?正規表現がどのように機能していると思うかを詳述したコメントのブロックは、後で来る人にとって、または今から 6 か月後に正規表現を見ていない自分のためにも役立ちます。

  3. パフォーマンス。まだ正しい答えを与えるが、より速く「実行」される正規表現の代替「言い回し」はありますか?

あなたの正規表現を取ると、あなたの定義を考えると、私はそれを別の方法で行ったと思います。このバージョンはより短いことに注意してください。したがって、非常に単純なメトリクスにより、保守が容易になります。

temp=$(echo $file_timestamp \
| egrep '^20[0-9][0-9][0-1][0-9][0-3][1-9][0-2][0-9][0-5][0-9][0-5][0-9]$'
)

グループ化文字の使用法を説明したくなければ( .... )、それらの用途はわかりません。

(私が考えることができる唯一のことは、指定された形式YYYYMMddhhmmssがあなたが示しているよりも柔軟であるということです。ユーザーが入力する可能性のある日付の形式、つまりYYYYMdhmsに一致させようとしているわけではありません(いずれかの先頭にゼロがある場合気をつけてください、これはあなたのシステムに入る狂気と間違ったデータへの道です! ;-)

最後に、検証で $temp をどのように使用するかを示していません。既存の変数を検証する (そしてより柔軟な) はるかに簡単な方法は、case ステートメントを使用することだと思います。試す

 case ${file_timestamp) in
     20[0-9][0-9][0-1][0-9][0-3][1-9][0-2][0-9][0-5][0-9][0-5][0-9] )
       print -u2 -- "dbg: valid : file_timestamp=${file_timestamp}"
       # do other good stuff here
     ;;
     * )
       print -u2 -- "dbg:NOT valid : file_timestamp=${file_timestamp} "
       # do other error reporting or fixing here
     ;;
   esac

これで、 $( ... ) およびgrep.

のようなグループ化文字が必要な場合(2[0-9])は、ksh 正規表現が()グループ化をサポートしていないため、grep (sed、awk など) を使用する必要があります (ほぼ確実です)。

IHTH

于 2012-12-26T22:21:39.767 に答える