> H.Hiroです。

山口です。
ご教示ありがとうございます。

> 山口さんの意図した通りか少々不安がありますが、

期待通りでした
 
> 修正前 /^ *ls *>? *(?<f>[^>]*) *$/
> 修正後 /^ *ls(?: *> *(?<f>[^ >]+))? *$/
> 
> とすれば
> 
> match:       pattern:"ls"
> match:       pattern:" ls  "
> match:       pattern:"ls  "
> not match             pattern:"ls>"
> match: tako      pattern:"ls>tako"
> match: tako      pattern:"ls > tako"
> not match             pattern:"ls>tako ika"
> not match             pattern:" cd"
> 
> となり、"ls>"(">"で終わる場合)や"ls> tako ika"(">"のあとに2語以上が
続く場合)を排除できました。
> 
> [">"のあとに2語以上が続く場合を排除する]
> 
> これは、"(?<f>[^>]*)" を "(?<f>[^ >]*)" に変更すれば実現できます。
> この部分はこのままではスペースにもマッチするため、スペースが(必要なら
ば別の文字も除外対象に加えてください)マッチしないようにすれば、1語のみ
が続く場合を表現できるというものです。

スペースを除外対象にするまで、頭が回りませんでした。

> [">"で終わる場合を排除する]
> 
> これは、"(?<f>[^ >]*)" を "(?<f>[^ >]+)"
> に変更すれば実現できます。"*"ではこの部分に何もなくてもマッチするため、
最低1文字はあるという意味を表す"+"に変更すればよいです。

なるほど。
 
> [">"で終わる場合は排除するものの、"ls"のみなら受容したい]
> 
> これは、">" だけでなく "*> *(?<f>[^ >]+)" の部分全体に "?" を付けるこ
とで実現できます。

この部分、とくに目が鱗でした。

ご教示いただいた正規表現から、少し追加対応を行いました。

今まで、自プログラム内で、prompt にて、"ls"と"ls > file" 別々の正規表現
で対応していたのを、
1つの正規表現で実現できるようになり、すっきりしました。

ありがとうございました。

文字列を、"shellのトークンに分解" してくれるような、gem ありますでしょう
か?
後々の追加対応等の場合、トークンをprogram処理していく方が、正規表現修正
より
メンテナンスしやすいなと...