[ruby-list:50556] Re: [質問] 正規表現
From:
<yamataka@...08.itscom.net>
Date:
2017-07-20 11:52:16 UTC
List:
ruby-list #50556
> 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処理していく方が、正規表現修正 より メンテナンスしやすいなと...