[ruby-list:50555] Re: [質問] 正規表現
From:
"H.Hiro" <main@...>
Date:
2017-07-20 01:37:05 UTC
List:
ruby-list #50555
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>[^ >]+)" の部分全体に "?" を付けることで実現できます。
2017年7月19日 16:45 <yamataka@u08.itscom.net>:
> 山口です。
>
> yama@JPC20316739:/tmp$ uname -a
> CYGWIN_NT-6.1 JPC20316739 2.8.0(0.309/5/3) 2017-04-01 20:47 x86_64
> Cygwin
> yama@JPC20316739:/tmp$ ruby --version
> ruby 2.3.3p222 (2016-11-21 revision 56859) [x86_64-cygwin]
>
> の環境で、
>
> yama@JPC20316739:/tmp$ cat regexp.rb
> input=["ls" ,\
> " ls " ,\
> "ls " ,\
> "ls>" ,\
> "ls>tako" ,\
> "ls > tako" ,\
> "ls>tako ika" ,\
> " cd" ]
>
> input.each do |pattern|
> case pattern
> when /^ *ls *>? *(?<f>[^>]*) *$/
> wfname = $~[:f]
> puts "match: #{wfname} pattern:\"#{pattern}\""
> else
> puts "not match pattern:\"#{pattern}\""
> end
> end
>
> を実行すると、
>
> yama@JPC20316739:/tmp$ ruby regexp.rb
> match: pattern:"ls"
> match: pattern:" ls "
> match: pattern:"ls "
> match: pattern:"ls>"
> match: tako pattern:"ls>tako"
> match: tako pattern:"ls > tako"
> match: tako ika pattern:"ls>tako ika"
> not match pattern:" cd"
>
> のようになるのですが、
> ”ls>” や “ls> tako ika” を
> マッチさせない正規表現の記述方法をご教示いただけないでしょうか?
> 若しくはもっとスマートな記述があれば、ご教示いただけると幸いです。
>
>
>
--
H.Hiro / Maraigue
http://hhiro.net/about/
main@hhiro.net