SOFTELメモ Developer's blog

会社概要 ブログ 調査依頼 社員募集 ...

【正規表現】「○○○を含まない」行にマッチする正規表現

問題

以下のプログラムソースから、”function”を含まない行を空文字に置換して、”function ~~~”となっている行だけ残したい。「”function”を含まない行」は正規表現でどうやって書いたらよい?

function test_func() {
    return 'test';
}

/**
 * テストのソース
 */
function hogefuga_func() {
    echo 'hogefuga';
}

function test_func() {
 
 
 
 
 
 
function hogefuga_func() {
 
 

答え

正規表現って、マッチさせるのは考えやすいけど、「マッチしない」って難しいですね。

否定的前方先読みができるときは、これでどうでしょう。

^((?!function).)*$

これで「”function”に続かない文字が、行頭から行末まで続く文字列」にマッチする。

否定的前方先読みができないときは、「○○○を含む」にマッチするかどうかの判定をしてその結果を反転して扱うのがよさそう。

まとめ

正規表現の(?~~)は便利。

x(?=y)

x に続いて y が現れる場合にのみ、x にマッチします(肯定的前方先読み)。例えば、 /Jack(?=Sprat)/ は、 ‘Jack’ に続いて ‘Sprat’ が現れる場合にのみ、’Jack’ にマッチします。 /Jack(?=Sprat|Frost)/ は、’Jack’ に続いて ‘Sprat’ か ‘Frost’ が現れる場合にのみ、’Jack’ にマッチします。 しかし、 ‘Sprat’ も ‘Frost’ もマッチした結果には含まれません。

x(?!y)

x に続いて y が現れない場合にのみ、x にマッチします【訳注: 否定的前方先読み】 。例えば、 /\d+(?!\.)/ は、 ある数に続いて小数点が現れない場合にのみ、その数字にマッチします。

/\d+(?!\.)/.exec(“3.141”) は、141 にはマッチしますが、3.141 にはマッチしません。

参考

https://developer.mozilla.org/Ja/Core_JavaScript_1.5_Reference/Global_Objects/RegExp

関連するメモ

コメント