Skip to content

Instantly share code, notes, and snippets.

@gfx
Last active September 17, 2017 21:57
Show Gist options
  • Save gfx/7973689 to your computer and use it in GitHub Desktop.
Save gfx/7973689 to your computer and use it in GitHub Desktop.
正規表現リテラルがあると便利な例。これを文字列操作メソッドで解決するとなるとかなり難しいと思われますがどうでしょう。 また、正規表現リテラルがなくてもじっさいにはあまり変わりないのですが、 \S ではなく \\S と書かなければならなかったりして注意しなければならない点が増えます。
#!perl
use 5.10.0;
use strict;
use warnings;
my $localhost = join '|', map { quotemeta } 'localhost', '127.0.0.1';
my $s = "http://localhost/foo http://127.0.0.1/bar http://127_0_0_1/foo/bar/baz";
my @matched = $s =~ m{ http:// (?:$localhost) / \S+ }xg;
say "@matched"; # => http://localhost/foo http://127.0.0.1/bar
@gfx
Copy link
Author

gfx commented Dec 15, 2013

LOCALHOST_PATTERN = re.compile(r'http:// (' + LOCALHOST + r')/\S+', re.X)

この一行が象徴的なのですが、まさにこれが正規表現リテラル+変数展開が必要な理由に見えます。
つまり、本質的にできることは変わりませんが、変数があるたびに文字列リテラルを閉じて+を書いて変数を書いてい+を書いて文字列リテラルを開始して、というのがちいち面倒なんです。面倒だから簡単に書きたい、そのほうが生産性があがる、という話です。

@methane
Copy link

methane commented Dec 16, 2013

閉じて + というのは、

r'http:// (%s) /\S+' % LOCALHOST

とも書けますが、そうではなく埋め込みがしたいと。
それはもう完全に正規表現リテラルではなくて変数埋め込みの利点ですよね?

変数埋め込みも、あれば便利だと思いますが、 Python ではたった数タイプの削減のために
構文を複雑にはしないと蹴られました。

余談ですが、今開発中のプロジェクトでは現在 120 ファイルくらいあって、 import re しているのは
3ファイルだけでした。
もちろん、 import re とたった数タイプの面倒さを回避するために、正規表現ですれば簡単な事を
面倒な文字列操作にしたりはしていません。
startswithinsplit などの基本的な文字列操作でほとんどのケースをカバーできてます。

@gfx
Copy link
Author

gfx commented Dec 16, 2013

正規表現リテラルにおける変数展開の重要性についてはたびたび出していたつもりでしたが、その点説明不足であったのならすみません。たとえばJavaScriptは正規表現リテラルがあって変数展開のない言語ですが、これは非常に使いづらくリテラルだけあっても意味がないとぼくは考えます。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment