MW211 EXIT

devlog
正規表現/文字列の否定(3)文字単位での比較
2014年02月03日
文字列の否定は難しい。その文字列以外の文字をすべて該当されるのを模索中。
やっぱり、先読み・後読みができないとき厳しい。

先読み・後読みができれば、以下でいいのではないだろうか。
┌──────────────────────────────────────┐
│(?<!a)b|^b|a(?!b)|a$|[^ab]
└──────────────────────────────────────┘
#確かめてはいないが。。。

先読み・後読みができないとなると…。

┌──────────────────────────────────────┐
│a+[^ab]+b*|[^ab]+b+|a+(?!b)|a$|^b|[^ab]                                     │
└──────────────────────────────────────┘
上記の場合「aab」と「abb」の余分な部分がヒットしない。
分類:正規表現
正規表現/文字列の否定(2)行単位での比較
2014年02月02日
文字列の否定は難しいと述べたが、まずは行にその文字列が含まれるかを
判定する正規表現はわりと簡単にできる。
「^(?!.*文字列).*$」でOK。

先読み((?!)など)の場合、文字列が使えるので、これを利用する。

整理すると以下の通り。

「a」を含まない行。
┌──────────────────────────────────────┐
│^[^a]*$                                                                     │
└──────────────────────────────────────┘

「a」も「b」も含まない行。
┌──────────────────────────────────────┐
│^[^ab]*$                                                                    │
├──────────────────────────────────────┤
│^[^(a|b)]*$                                                                 │
│^[^(ab)]*$                                                                  │
└──────────────────────────────────────┘

「ab」を含まない行。
┌──────────────────────────────────────┐
│^(?!.*ab).*$                                                                │
└──────────────────────────────────────┘
分類:正規表現
正規表現/文字列の否定(1)
2014年02月01日
「ab」とかいう(連続する)文字列を除くという正規表現は実は難しい。

┌──────────────────────────────────────┐
│(ab|cd)                                                                     │
└──────────────────────────────────────┘
上記みたいに、括弧で囲えば文字列として認識してくれるのだから、
さぞ簡単かと思うが、以下のような指定は効かない。
┌──────────────────────────────────────┐
│[^(ab)]                                                                     │
└──────────────────────────────────────┘

以下と同じにみなされてしまう。
┌──────────────────────────────────────┐
│[^ab]                                                                       │
└──────────────────────────────────────┘

では、解決方法は?…難しい。
分類:正規表現
正規表現/括弧閉じ忘れ確認(二文字)
2014年01月31日
括弧の対応関係が合わない行をみつける正規表現。
括弧が二文字で構成されていると結構厄介。

例えば、C言語系における以下のコメント括弧。
┌──────────────────────────────────────┐
│/* コメント */                                                              │
└──────────────────────────────────────┘
二行以上に渡っても書けるが、この際、それは無視。一行のみ対象。

┌──────────────────────────────────────┐
│/\*(?!.*\*/)                                                                │
└──────────────────────────────────────┘
少しややこしい。
分類:正規表現
正規表現/括弧閉じ忘れ確認(一文字)
2014年01月30日
括弧の対応関係が合わない行をみつける正規表現。
┌──────────────────────────────────────┐
│\([^\)]*$                                                                   │
└──────────────────────────────────────┘
括弧が一文字だと簡単にできる。
分類:正規表現
正規表現/先頭のみ末尾のみ
2013年11月04日
「abba」という文字列で先頭の「b」もしくは、末尾の「b」のみを検索する正規表現。
┌────┬─────────────────────────────────┐
│先頭のみ│(?<=^[^b]*)b                                                      │
├────┼─────────────────────────────────┤
│末尾のみ│b(?=[^b]*$)                                                       │
└────┴─────────────────────────────────┘

ちなみに逆にそれらを除いた場合。
┌────┬─────────────────────────────────┐
│先頭以外│(?<!^[^b]*)b                                                      │
├────┼─────────────────────────────────┤
│末尾以外│b(?![^b]*$)                                                       │
└────┴─────────────────────────────────┘

ついでに応用で、一つしかない場合のみヒットさせるのはこれ。
┌────┬─────────────────────────────────┐
│唯一    │(?<=^[^b]*)b(?=[^b]*$)                                            │
└────┴─────────────────────────────────┘

【注意】
  preg系では「(?<=.*)」のような可変のものは認められないので
  エラーとなる模様。
分類:正規表現
正規表現/後方最短一致
2013年09月09日
例えばあるURLの末尾の階層だけを除外したい場合の正規表現による置換を考えた。
つまり「http://aaa/bbb」を「http://aaa」にする置換だ。

まず「/\.*$」が思いつくが、これは最長一致検索となるので
「//aaa/bbb」が該当してしまい(結果が「http:」となり)うまくいかない。

最短一致検索は「?」を使う方法があるが、これは前方にしか使えないらしく
「/\.*?$」だと「//aaa/bbb」が該当してしまう

ということで試行錯誤した結果こんな感じとなることがわかった。
┌──────────────────────────────────────┐
│preg_replace('/\/[^\/]*$/', '', 'http://aaa/bbb');                          │
└──────────────────────────────────────┘

末尾に「/」がついている場合もあるので、この場合はこう。
┌──────────────────────────────────────┐
│preg_replace('/\/[^\/]*\/$/', '', 'http://aaa/bbb/');                       │
└──────────────────────────────────────┘

両方に対応できるようにまとめるとこう。
┌──────────────────────────────────────┐
│preg_replace('/(\/[^\/]*$|\/[^\/]*\/$)/', '', 'http://aaa/bbb/');           │
└──────────────────────────────────────┘

もっとスマートにまとめればこうだ。
┌──────────────────────────────────────┐
│preg_replace('/\/[^\/]*\/?$/', '', 'http://aaa/bbb/');                      │
└──────────────────────────────────────┘

いずれも「http://aaa」になる。

  ┌───┬────────────────────────────────┐
  │置換前│\/[^\/]*\/?$                                                    │
  ├───┼────────────────────────────────┤
  │置換後│                                                          (なし)│
  └───┴────────────────────────────────┘
分類:正規表現
正規表現/先頭部分のみ置換
2012年09月21日
先頭に0以上の半角スペースが並んでいる文字列について、
先頭の部分の半角スペース二つを全角スペースに置換したい。
もちろん先頭以外の半角スペースは対象外。
(以下、全角スペースを△で表記)
・「   abc」       →○「△ abc」
・「     abc」     →○「△△ abc」
・「   abc  def  」→○「△ abc  def  」
・「   abc  def  」→×「△ abc△def△」
これって、正規表現だけで実現可能なもんなのかね?
分類:正規表現、【未解決】
正規表現/文字コードの中身
2012年04月15日
正規表現で頻出の「[\x21-\x7E]」の中身は以下の通り。
┌─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┐
│\│_0│_1│_2│_3│_4│_5│_6│_7│_8│_9│_A│_B│_C│_D│_E│_F│
├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
│2_│  │! │" │# │$ │% │& │' │( │) │* │+ │, │- │. │/ │
├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
│3_│0 │1 │2 │3 │4 │5 │6 │7 │8 │9 │: │; │< │= │> │? │
├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
│4_│@ │A │B │C │D │E │F │G │H │I │J │K │L │M │N │O │
├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
│5_│P │Q │R │S │T │U │V │W │X │Y │Z │[ │\ │] │^ │_ │
├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
│6_│` │a │b │c │d │e │f │g │h │i │j │k │l │m │n │o │
├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
│7_│p │q │r │s │t │u │v │w │x │y │z │{ │| │} │~ │  │
└─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┘

なので英数字以外の記号といったら、以下を意識するとよいだろう。
「!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~」
分類:正規表現
正規表現/否定の勘違い
2012年03月31日
否定、つまりその文字以外を該当させるのはこんな感じ。
「[^■]」

「a」でも「b」でもないってしたい場合は、この中に並べればよい。

「[^a^b]」
で、これは誤り。

「[^ab]」
が正解。

先頭に一回否定「^」を書けば、以降すべて否定の対象になる。

「^+検索対象文字」ではなく、「[^]」をセットとして覚えてしまおう。
分類:注意、正規表現
前へ 1 2 3 次へ