Ruby

正規表現からテキストデータを生成する方法

正規表現からテキストデータを生成したいシーンと言うと、サンプルデータ、フェイクデータがほしいとか、または単純に、ノートテイキングなどにおいて、すべてのテキストの候補を書くのが面倒だったり正規表現で書いておいたほうがすっきりするからという理由だったりするかもしれません。

以下はまさにそのことについての質問です。

java – Using Regex to generate Strings rather than match them – Stack Overflow

上記にも出てきているGenerexを含めて、軽く探してみた所、もう一つRubyのライブラリが見つかりました。

mifmif/Generex: A Java library for generating String from a regular expression.
tom-lord/regexp-examples: Generate strings that match a given regular expression

こちらのほうが新しく、Rubyということでとっつきやすさもあります。Javaのほうはかなり古いですが、機能的にはあまり変わらなそうです。しかしRubyは「正規表現に強い言語」としても有名ですので、Rubyのほうが期待値は高そうですね。

ということで使ってみました。

インストールは以下。

cat >> Gemfile
gem 'regexp-examples'

bundle install

ところで、最近Googleでバルク検索するツールを作りました。何かを検索するときは英語なんですが、僕もネイティブじゃありませんので、より適切な単語があったりするわけです。例えば make より create のほうが適切な場合があったり、その逆があったり、するわけですね。そういうときには how to (make|create) something って書いておいて、regexp-examplesにてテキストデータを生成してやって、それをGoogle検索してやれるわけですね。

how to make something
how to create something

プログラミング熱をこじらせて遂には「プログラミング言語で小説を書きたい」なんて思ってしまった僕。効率的なGooglingをするべく、以下のような正規表現をregexp-examplesで試してみました。

require "regexp-examples"

# puts /a*/.examples #=> ['', 'a', 'aa']

puts /(writing|construct|make) (novel )?story (by|with) (programming|predicate logic)/.examples

https://yuis.xsrv.jp/images/ss/ShareX_ScreenShot_8b474c7c-716e-4b06-abfd-557aad05a6ba.png

結果は以下です。素晴らしいですね。

writing story by programming
writing story by predicate logic
writing story with programming
writing story with predicate logic
writing novel story by programming
writing novel story by predicate logic
writing novel story with programming
writing novel story with predicate logic
construct story by programming
construct story by predicate logic
construct story with programming
construct story with predicate logic
construct novel story by programming
construct novel story by predicate logic
construct novel story with programming
construct novel story with predicate logic
make story by programming
make story by predicate logic
...

蛇足ですが、小説をプログラミングするのは人類にはまだ早かったようです。残念ですね。