JVM言語で正規表現してみた
レポートにC言語以外のプログラミング言語における正規表現の扱い方を調べてC言語と比較せよって項目があったのでJVM言語でやってみた
C言語 (今回実装する機能*1 )
#include <stdio.h> #include <regex.h> int main(int argv, char* args[]) { char str[] = "C言語で正規表現"; char regex[] = "正規表現"; regex_t preg; if (regcomp(&preg,regex, REG_EXTENDED | REG_NEWLINE ) != 0) { printf("Error"); return 1; } if(!(regexec(&preg, str,0,NULL,0) != 0)) { printf("Match: %s\n",str); } else { printf("No Match: %s\n",str); } regfree(&preg); return 0; }
参考
Java
import java.util.regex.Pattern; import java.util.regex.Matcher; class Regex{ public static void main(String args[]){ String str = "Javaで正規表現"; String regex = "正規表現"; Pattern p = Pattern.compile(regex); Matcher m = p.matcher(str); if(m.find()) { System.out.println("Match: " + str); } else { System.out.println("No Match: " + str); } } }
matches,findの違いについて
Scala
val s = "Scalaで正規表現" val r = "正規表現".r if(r.findFirstIn(s).nonEmpty) println("Match: " + s) else println("No Match: " + s)
Kotlin
fun main(arge: Array<String>) { val str = "Kotlinで正規表現" val regex = Regex("正規表現") if(regex.containsMatchIn(str)) println("Match: " + str) else println("No Match: " + str) }
参考
Clojure
(def text "Clojureで正規表現") (print (if (re-find #"正規表現" text) "Match: " "No Match: " ) text "\n") (print (if (re-seq #"正規表現" text) "Match: " "No Match: " ) text "\n")
雑感
Kotlinを除き若い言語ほど正規表現を使うのが手軽になってきていると思った。(小並感)
正規表現は取っ付きづらいイメージがあったけど実際に使ってみるとそうでも無かった。パターンは書くのめんどくさいけど・・・
Groovyの
=~
は初めてみるやり方だったので感心した。Haskellとか他の言語にも実装されているらしいけどね。(正規表現を全く使わないので分からず)
*1:本当はしっかりパターンを記述するべきだろうけど・・・
Minecraft ModをKotlinで書いてみた
Gradleが使えるので簡単にMinecraftも動かせると思ったのでやってみた
kotlinlang.org
まだ考えて書けるレベルまでできてないので今回はこれで変換したコードを動かした
try.kotlinlang.org
対象のコード(初期のコードを変換させただけ、名前空間のところは削ったけど)
package com import net.minecraft.init.Blocks import net.minecraftforge.fml.common.Mod import net.minecraftforge.fml.common.Mod.EventHandler import net.minecraftforge.fml.common.event.FMLInitializationEvent @Mod(modid = ExampleMod.MODID, version = ExampleMod.VERSION) class ExampleMod { @EventHandler fun init(event:FMLInitializationEvent) { System.out.println("DIRT BLOCK >> " + Blocks.dirt.getUnlocalizedName()) } companion object { const val MODID = "examplemod" const val VERSION = "1.0" } }
Gradle
gist.github.com
英語サイト見るまでランタイムがないってことがわからずとても苦労した。
まだGradleの使い方が理解できてない・・・
iframeでJavaScriptを動的に実行する
(タイトルおかしいと思ったので編集しました)
iframeを用いてJavaScriptコードを動的実行する。
やり方は主に3つ(多分)あって、
document.write(content);
と
document.srcdoc=content;
と
document.appendChild(content);
がある。docは同じとは限らない。
write版
var doc = document.getElementById("iframe").contentWindow.document; var content = 'console.log("Hello World!");'; doc.open(); doc.write('<div><script>' + content + '<\/script><\/div>'); doc.close();
srcdoc版
var doc = document.getElementById("iframe"); doc.srcdoc = '<div><script>console.log("Hello World!");<\/script><\/div>';
appendChild版
var script = document.createElement("script"); script.type = "text/javascript"; script.innerHTML = 'console.log("Hello World!")'; doc.body.appendChild(script);
write版とappendChildは直接iframe内のHTMLに挿入する感じ。対してsrcdoc版はタグの要素に入れるため生成後のHTMLコードを見ると汚いと感じるかもしれない。
"と'は使い分けていかないと動かないので注意
こういったことも可能らしい
ja.stackoverflow.com
個人的にはappendChild版が一番好き
パフォーマンスは知らない。
あとJSファイルを作成して追加する方法もできそう。