2015年2月20日金曜日

なんとなくperlで正規表現練習



perlの正規表現で否定的先読みがある。

検索文字(?!パターン)


どういう効果があるかは「正規表現 後読み 先読み」とかでググると色々な例があるよ。


以降なんとなく正規表現練習。

echo -e '
unused
 aaaa =>        bbbb// cccc
,dddd =>        array()
     ffff =>array( // gggg
        ,hhhh =>array(
'

以上をLinuxコマンドに「echomatch」として登録。
コマンド自作方法は「shellscript 自作コマンド」でググると大体おk。

LinuxについてはVagrantとVirtualBoxを使って、実験用の仮想環境を作ろう。
私はなんとなく「CentOS 6.5 64bit」を使ってる。



①「unused」は行回避する
②「array(」も行回避する
③コメント部分は回避する
④「=>」の行は一致させる

「=>」行を一致

echomatch  | grep -Po --color '^.*=>.*'
 aaaa =>                bbbb// cccc
,dddd =>                array()
         ffff =>array( // gggg
                ,hhhh =>array(
        ,iiii =>array(jjjj) // kkkk

---------------- ---------------- ---------------- ----------------

コメント部分を行回避

echomatch  | grep -P --color '(^.*=>[\t ]*)(?!.*//).*'
,dddd =>                array()
                ,hhhh =>array(

---------------- ---------------- ---------------- ----------------

コメント行に一致させつつ、コメント部分を回避

echomatch  | grep -P --color '(^.*=>[\t ]*).*(?=//)'
 aaaa =>                bbbb
         ffff =>array(
        ,iiii =>array(jjjj)

---------------- ---------------- ---------------- ----------------

2つを合体させて、コメント部分だけを回避

echomatch  | grep -P --color '(^.*=>[\t ]*)(.*(?=//)|(?!.*//).*)'
 aaaa =>                bbbb
,dddd =>                array()
         ffff =>array(
                ,hhhh =>array(
        ,iiii =>array(jjjj)

---------------- ---------------- ---------------- ----------------

「array(」で終わる行を回避

echomatch  | grep -P --color '(^.*=>[\t ]*)((?!.*array\()|(?=.*array\(.*\))).*'
 aaaa =>                bbbb// cccc
,dddd =>                array()
        ,iiii =>array(jjjj) // kkkk

---------------- ---------------- ---------------- ----------------

これも合体させます、「array(」は行削除なので最優先で行います。また、「array()」は削除されないよう、「array(」と同レベルの優先度行います
コメント回避は後ろに置きます。部分回避は大体後ろに置かないと死ぬ。


echomatch  | grep -P --color '(^.*=>[\t ]*)((?!.*array\()|(?=.*array\(.*\)))(.*(?=//)|(?!.*//).*)'
 aaaa =>                bbbb// cccc
,dddd =>                array()
        ,iiii =>array(jjjj) // kkkk

---------------- ---------------- ---------------- ----------------



コメント回避を場合分けで対処するのはエレガントじゃないよね、他に方法思いつかない。



おまけ




なんとなく冬美貼る。
てかソースコードのように書くのめっちゃめんどい。
あとこれプレビュー反応しねえ。

0 件のコメント:

コメントを投稿