読者です 読者をやめる 読者になる 読者になる

正規表現入門

この記事は、TUT Advent Calendar 2016 - Adventar の13日目の記事です。

エクストリーム正規表現入門はこちら

 

813.hatenablog.com

 

正規表現とは?

正規表現は、文字列のパターンを表す文字列である。これによってgrepなどで検索や置換をすることができる。
プログラミング言語にかかわらずエディタでも同様に使えるため、プログラムを書かない人も、覚えると便利だと思う。

今回は環境構築等を省くため、ブラウザ上で動く以下のツールを紹介する。
PHP正規表現チェッカー
ただ、正規表現は言語や環境で大きく変わるものではないため、リンク切れやうまく動かない場合は適当なツールで試すことができるはずである。

正規表現を学ぶ前に

まず大事なことは、最初から正規表現で全てを表現しようとしないことである。
入力値の法則を完璧に見極めないうちから細かな正規表現を書くと、人的リソースや計算リソースを浪費するばかりでなく、正常な動作が損なわれる原因にもなる。

投稿日時: 2016/9/7 1:23:45
最終更新日時: 2016/11/29 23:0:0

投稿日時: 2016/08/10 11:45:14
最終更新日時: 2016/08/10 11:45:14

こんなテキストから投稿日時を抜き出すとしよう。今回説明することをマスターすれば、下のような正規表現は簡単に書くことができるようになる。この記事を読み終わったら戻ってきて解読してみてほしい。

(?<=投稿日時: )(\d{4}/(?:0?[1-9]|1[0-2])/(?:0?[1-9]|[12]\d|3[01]) (?:[01]\d|2[0-3])(?::([0-5]\d))+)

しかしこれは4月31日や平年の2月29日も含めてしまうし、もっと致命的な例では閏秒を含まない。日付チェックなどは組み込み関数やライブラリに任せてしまって、正規表現ではそれっぽい箇所を抜き出すだけに留めるべきである。以下で十分だ。

(?<=投稿日時: )(\d{4}(?:/\d{,2}){2} \d{,2}(?::\d{,2}){2})

長々と正規表現を書いていると、気持ちよくなってきて更に長い正規表現を書いてしまう人がたまに居るが、あくまで奥の手か孫の手くらいにしておいて、複雑な正規表現をプログラムでゴリゴリ回すのはやめるべきである。メンテナンス性が悪い上に重くなる可能性が高い。

続きを読む

エクストリーム正規表現入門

この記事は、TUT Advent Calendar 2016 - Adventar の13日目の記事です。

正規表現入門はこちら

 

813.hatenablog.com

 

上司「正規表現を使うと文字列を条件によって置き換えることができる」

めう「できるめう」

上司「でも正規表現で計算はできない」

めう「perl正規表現内サブルーチン呼び出し等を除いてはできないめう…」

上司「そこで正規表現を幾重にも繰り返す」

めう「

上司「正規表現を使って加算ができた」

めう「やっためう!すごいめう!」

f:id:DCCCXIII:20161213235212p:plain

minimapの前半が圧巻。

トレースはこんな感じ。文字列として計算しているので、数千桁の精度で計算できる。

> ./regAdd.py -t 9009 29011
    : 9009+29011
================ pre ================
0000: 9009_+29011
0001: 9009_+29011_=
    : 9009_+29011_=
converged


================ main ================
0000: 9009_+29011_=
0001: 9009_+29011_=
0002: 9009_+29011_=
0003: 9009_+29011_=
0004: 9009_+29011_=
0005: 9009_+29011_=
0006: 9009_+29011_=
0007: 9009_+29011_=
0008: 9009_+29011_=
0009: 9009_+29011_=
0010: 9009_+29011_=
0011: 9009_+29011_=
0012: 9009_+29011_=
0013: 9009_+29011_=
0014: 9009_+29011_=
0015: 9009_+29011_=
0016: 9009_+29011_=
0017: 9009_+29011_=
0018: 9009_+29011_=
0019: 9009_+29011_=
0020: 9009_+29011_=
0021: 9009_+29011_=
0022: 9009_+29011_=
0023: 9009_+29011_=
0024: 9009_+29011_=
0025: 9009_+29011_=
0026: 9009_+29011_=
0027: 9009_+29011_=
0028: 9009_+29011_=
0029: 9009_+29011_=
0030: 9009_+29011_=
0031: 9009_+29011_=
0032: 9009_+29011_=
0033: 9009_+29011_=
0034: 9009_+29011_=
0035: 9009_+29011_=
0036: 9009_+29011_=
0037: 9009_+29011_=
0038: 9009_+29011_=
0039: 9009_+29011_=
0040: 9009_+29011_=
0041: 9009_+29011_=
0042: 9009_+29011_=
0043: 9009_+29011_=
0044: 9009_+29011_=
0045: 9009_+29011_=
0046: 9009_+29011_=
0047: 9009_+29011_=
0048: 9009_+29011_=
0049: 9009_+29011_=
0050: 9009_+29011_=
0051: 9009_+29011_=
0052: 9009_+29011_=
0053: 9009_+29011_=
0054: 9009_+29011_=
0055: 9009_+29011_=
0056: 9009_+29011_=
0057: 9009_+29011_=
0058: 9009_+29011_=
0059: 9009_+29011_=
0060: 9009_+29011_=
0061: 9009_+29011_=
0062: 9009_+29011_=
0063: 9009_+29011_=
0064: 9009_+29011_=
0065: 9009_+29011_=
0066: 9009_+29011_=
0067: 9009_+29011_=
0068: 9009_+29011_=
0069: 9009_+29011_=
0070: 9009_+29011_=
0071: 9009_+29011_=
0072: 9009_+29011_=
0073: 9009_+29011_=
0074: 9009_+29011_=
0075: 9009_+29011_=
0076: 9009_+29011_=
0077: 9009_+29011_=
0078: 9009_+29011_=
0079: 9009_+29011_=
0080: 9009_+29011_=
0081: 9009_+29011_=
0082: 9009_+29011_=
0083: 9009_+29011_=
0084: 9009_+29011_=
0085: 9009_+29011_=
0086: 9009_+29011_=
0087: 9009_+29011_=
0088: 9009_+29011_=
0089: 9009_+29011_=
0090: 9009_+29011_=
0091: 9009_+29011_=#0
0092: 9009_+29011_=#0
0093: 9009_+29011_=#0
0094: 9009_+29011_=#0
0095: 9009_+29011_=#0
0096: 9009_+29011_=#0
0097: 9009_+29011_=#0
0098: 9009_+29011_=#0
0099: 9009_+29011_=#0
0100: 900_9+2901_1=#0
0101: 900_9+2901_1=#0
    : 900_9+2901_1=#0
0000: 900_9+2901_1=#0
0001: 900_9+2901_1=1#0
0002: 900_9+2901_1=1#0
0003: 900_9+2901_1=1#0
0004: 900_9+2901_1=1#0
0005: 900_9+2901_1=1#0
0006: 900_9+2901_1=1#0
0007: 900_9+2901_1=1#0
0008: 900_9+2901_1=1#0
0009: 900_9+2901_1=1#0
0010: 900_9+2901_1=1#0
0011: 900_9+2901_1=1#0
0012: 900_9+2901_1=1#0
0013: 900_9+2901_1=1#0
0014: 900_9+2901_1=1#0
0015: 900_9+2901_1=1#0
0016: 900_9+2901_1=1#0
0017: 900_9+2901_1=1#0
0018: 900_9+2901_1=1#0
0019: 900_9+2901_1=1#0
0020: 900_9+2901_1=1#0
0021: 900_9+2901_1=1#0
0022: 900_9+2901_1=1#0
0023: 900_9+2901_1=1#0
0024: 900_9+2901_1=1#0
0025: 900_9+2901_1=1#0
0026: 900_9+2901_1=1#0
0027: 900_9+2901_1=1#0
0028: 900_9+2901_1=1#0
0029: 900_9+2901_1=1#0
0030: 900_9+2901_1=1#0
0031: 900_9+2901_1=1#0
0032: 900_9+2901_1=1#0
0033: 900_9+2901_1=1#0
0034: 900_9+2901_1=1#0
0035: 900_9+2901_1=1#0
0036: 900_9+2901_1=1#0
0037: 900_9+2901_1=1#0
0038: 900_9+2901_1=1#0
0039: 900_9+2901_1=1#0
0040: 900_9+2901_1=1#0
0041: 900_9+2901_1=1#0
0042: 900_9+2901_1=1#0
0043: 900_9+2901_1=1#0
0044: 900_9+2901_1=1#0
0045: 900_9+2901_1=1#0
0046: 900_9+2901_1=1#0
0047: 900_9+2901_1=1#0
0048: 900_9+2901_1=1#0
0049: 900_9+2901_1=1#0
0050: 900_9+2901_1=1#0
0051: 900_9+2901_1=1#0
0052: 900_9+2901_1=1#0
0053: 900_9+2901_1=1#0
0054: 900_9+2901_1=1#0
0055: 900_9+2901_1=1#0
0056: 900_9+2901_1=1#0
0057: 900_9+2901_1=1#0
0058: 900_9+2901_1=1#0
0059: 900_9+2901_1=1#0
0060: 900_9+2901_1=1#0
0061: 900_9+2901_1=1#0
0062: 900_9+2901_1=1#0
0063: 900_9+2901_1=1#0
0064: 900_9+2901_1=1#0
0065: 900_9+2901_1=1#0
0066: 900_9+2901_1=1#0
0067: 900_9+2901_1=1#0
0068: 900_9+2901_1=1#0
0069: 900_9+2901_1=1#0
0070: 900_9+2901_1=1#0
0071: 900_9+2901_1=1#0
0072: 900_9+2901_1=1#0
0073: 900_9+2901_1=1#0
0074: 900_9+2901_1=1#0
0075: 900_9+2901_1=1#0
0076: 900_9+2901_1=1#0
0077: 900_9+2901_1=1#0
0078: 900_9+2901_1=1#0
0079: 900_9+2901_1=1#0
0080: 900_9+2901_1=1#0
0081: 900_9+2901_1=1#0
0082: 900_9+2901_1=1#0
0083: 900_9+2901_1=1#0
0084: 900_9+2901_1=1#0
0085: 900_9+2901_1=1#0
0086: 900_9+2901_1=1#0
0087: 900_9+2901_1=1#0
0088: 900_9+2901_1=1#0
0089: 900_9+2901_1=1#0
0090: 900_9+2901_1=1#0
0091: 900_9+2901_1=1#0
0092: 900_9+2901_1=1#0
0093: 900_9+2901_1=1#0
0094: 900_9+2901_1=1#0
0095: 900_9+2901_1=1#0
0096: 900_9+2901_1=1#0
0097: 900_9+2901_1=1#0
0098: 900_9+2901_1=1#0
0099: 900_9+2901_1=1#0
0100: 90_09+290_11=1#0
0101: 90_09+290_11=1#0
    : 90_09+290_11=1#0
0000: 90_09+290_11=01#0
0001: 90_09+290_11=01#0
0002: 90_09+290_11=01#0
0003: 90_09+290_11=01#0
0004: 90_09+290_11=01#0
0005: 90_09+290_11=01#0
0006: 90_09+290_11=01#0
0007: 90_09+290_11=01#0
0008: 90_09+290_11=01#0
0009: 90_09+290_11=01#0
0010: 90_09+290_11=01#0
0011: 90_09+290_11=01#0
0012: 90_09+290_11=01#0
0013: 90_09+290_11=01#0
0014: 90_09+290_11=01#0
0015: 90_09+290_11=01#0
0016: 90_09+290_11=01#0
0017: 90_09+290_11=01#0
0018: 90_09+290_11=01#0
0019: 90_09+290_11=01#0
0020: 90_09+290_11=01#0
0021: 90_09+290_11=01#0
0022: 90_09+290_11=01#0
0023: 90_09+290_11=01#0
0024: 90_09+290_11=01#0
0025: 90_09+290_11=01#0
0026: 90_09+290_11=01#0
0027: 90_09+290_11=01#0
0028: 90_09+290_11=01#0
0029: 90_09+290_11=01#0
0030: 90_09+290_11=01#0
0031: 90_09+290_11=01#0
0032: 90_09+290_11=01#0
0033: 90_09+290_11=01#0
0034: 90_09+290_11=01#0
0035: 90_09+290_11=01#0
0036: 90_09+290_11=01#0
0037: 90_09+290_11=01#0
0038: 90_09+290_11=01#0
0039: 90_09+290_11=01#0
0040: 90_09+290_11=01#0
0041: 90_09+290_11=01#0
0042: 90_09+290_11=01#0
0043: 90_09+290_11=01#0
0044: 90_09+290_11=01#0
0045: 90_09+290_11=01#0
0046: 90_09+290_11=01#0
0047: 90_09+290_11=01#0
0048: 90_09+290_11=01#0
0049: 90_09+290_11=01#0
0050: 90_09+290_11=01#0
0051: 90_09+290_11=01#0
0052: 90_09+290_11=01#0
0053: 90_09+290_11=01#0
0054: 90_09+290_11=01#0
0055: 90_09+290_11=01#0
0056: 90_09+290_11=01#0
0057: 90_09+290_11=01#0
0058: 90_09+290_11=01#0
0059: 90_09+290_11=01#0
0060: 90_09+290_11=01#0
0061: 90_09+290_11=01#0
0062: 90_09+290_11=01#0
0063: 90_09+290_11=01#0
0064: 90_09+290_11=01#0
0065: 90_09+290_11=01#0
0066: 90_09+290_11=01#0
0067: 90_09+290_11=01#0
0068: 90_09+290_11=01#0
0069: 90_09+290_11=01#0
0070: 90_09+290_11=01#0
0071: 90_09+290_11=01#0
0072: 90_09+290_11=01#0
0073: 90_09+290_11=01#0
0074: 90_09+290_11=01#0
0075: 90_09+290_11=01#0
0076: 90_09+290_11=01#0
0077: 90_09+290_11=01#0
0078: 90_09+290_11=01#0
0079: 90_09+290_11=01#0
0080: 90_09+290_11=01#0
0081: 90_09+290_11=01#0
0082: 90_09+290_11=01#0
0083: 90_09+290_11=01#0
0084: 90_09+290_11=01#0
0085: 90_09+290_11=01#0
0086: 90_09+290_11=01#0
0087: 90_09+290_11=01#0
0088: 90_09+290_11=01#0
0089: 90_09+290_11=01#0
0090: 90_09+290_11=01#0
0091: 90_09+290_11=01#0
0092: 90_09+290_11=01#0
0093: 90_09+290_11=01#0
0094: 90_09+290_11=01#0
0095: 90_09+290_11=01#0
0096: 90_09+290_11=01#0
0097: 90_09+290_11=01#0
0098: 90_09+290_11=01#0
0099: 90_09+290_11=01#0
0100: 9_009+29_011=01#0
0101: 9_009+29_011=01#0
    : 9_009+29_011=01#0
0000: 9_009+29_011=01#0
0001: 9_009+29_011=01#0
0002: 9_009+29_011=01#0
0003: 9_009+29_011=01#0
0004: 9_009+29_011=01#0
0005: 9_009+29_011=01#0
0006: 9_009+29_011=01#0
0007: 9_009+29_011=01#0
0008: 9_009+29_011=01#0
0009: 9_009+29_011=01#0
0010: 9_009+29_011=01#0
0011: 9_009+29_011=01#0
0012: 9_009+29_011=01#0
0013: 9_009+29_011=01#0
0014: 9_009+29_011=01#0
0015: 9_009+29_011=01#0
0016: 9_009+29_011=01#0
0017: 9_009+29_011=01#0
0018: 9_009+29_011=01#0
0019: 9_009+29_011=01#0
0020: 9_009+29_011=01#0
0021: 9_009+29_011=01#0
0022: 9_009+29_011=01#0
0023: 9_009+29_011=01#0
0024: 9_009+29_011=01#0
0025: 9_009+29_011=01#0
0026: 9_009+29_011=01#0
0027: 9_009+29_011=01#0
0028: 9_009+29_011=01#0
0029: 9_009+29_011=01#0
0030: 9_009+29_011=01#0
0031: 9_009+29_011=01#0
0032: 9_009+29_011=01#0
0033: 9_009+29_011=01#0
0034: 9_009+29_011=01#0
0035: 9_009+29_011=01#0
0036: 9_009+29_011=01#0
0037: 9_009+29_011=01#0
0038: 9_009+29_011=01#0
0039: 9_009+29_011=01#0
0040: 9_009+29_011=01#0
0041: 9_009+29_011=01#0
0042: 9_009+29_011=01#0
0043: 9_009+29_011=01#0
0044: 9_009+29_011=01#0
0045: 9_009+29_011=01#0
0046: 9_009+29_011=01#0
0047: 9_009+29_011=01#0
0048: 9_009+29_011=01#0
0049: 9_009+29_011=01#0
0050: 9_009+29_011=01#0
0051: 9_009+29_011=01#0
0052: 9_009+29_011=01#0
0053: 9_009+29_011=01#0
0054: 9_009+29_011=01#0
0055: 9_009+29_011=01#0
0056: 9_009+29_011=01#0
0057: 9_009+29_011=01#0
0058: 9_009+29_011=01#0
0059: 9_009+29_011=01#0
0060: 9_009+29_011=01#0
0061: 9_009+29_011=01#0
0062: 9_009+29_011=01#0
0063: 9_009+29_011=01#0
0064: 9_009+29_011=01#0
0065: 9_009+29_011=01#0
0066: 9_009+29_011=01#0
0067: 9_009+29_011=01#0
0068: 9_009+29_011=01#0
0069: 9_009+29_011=01#0
0070: 9_009+29_011=01#0
0071: 9_009+29_011=01#0
0072: 9_009+29_011=01#0
0073: 9_009+29_011=01#0
0074: 9_009+29_011=01#0
0075: 9_009+29_011=01#0
0076: 9_009+29_011=01#0
0077: 9_009+29_011=01#0
0078: 9_009+29_011=01#0
0079: 9_009+29_011=01#0
0080: 9_009+29_011=01#0
0081: 9_009+29_011=01#0
0082: 9_009+29_011=01#0
0083: 9_009+29_011=01#0
0084: 9_009+29_011=01#0
0085: 9_009+29_011=01#0
0086: 9_009+29_011=01#0
0087: 9_009+29_011=01#0
0088: 9_009+29_011=01#0
0089: 9_009+29_011=01#0
0090: 9_009+29_011=01#0
0091: 9_009+29_011=01#0
0092: 9_009+29_011=01#0
0093: 9_009+29_011=01#0
0094: 9_009+29_011=01#0
0095: 9_009+29_011=01#0
0096: 9_009+29_011=01#0
0097: 9_009+29_011=01#0
0098: 9_009+29_011=01#0
0099: 9_009+29_011=#801#0
0100: _9009+2_9011=#801#0
0101: _9009+2_9011=#801#0
    : _9009+2_9011=#801#0
0000: _9009+2_9011=#801#0
0001: _9009+2_9011=#801#0
0002: _9009+2_9011=2#801#0
0003: _9009+2_9011=2#801#0
0004: _9009+2_9011=2#801#0
0005: _9009+2_9011=2#801#0
0006: _9009+2_9011=2#801#0
0007: _9009+2_9011=2#801#0
0008: _9009+2_9011=2#801#0
0009: _9009+2_9011=2#801#0
0010: _9009+2_9011=2#801#0
0011: _9009+2_9011=2#801#0
0012: _9009+2_9011=2#801#0
0013: _9009+2_9011=2#801#0
0014: _9009+2_9011=2#801#0
0015: _9009+2_9011=2#801#0
0016: _9009+2_9011=2#801#0
0017: _9009+2_9011=2#801#0
0018: _9009+2_9011=2#801#0
0019: _9009+2_9011=2#801#0
0020: _9009+2_9011=2#801#0
0021: _9009+2_9011=2#801#0
0022: _9009+2_9011=2#801#0
0023: _9009+2_9011=2#801#0
0024: _9009+2_9011=2#801#0
0025: _9009+2_9011=2#801#0
0026: _9009+2_9011=2#801#0
0027: _9009+2_9011=2#801#0
0028: _9009+2_9011=2#801#0
0029: _9009+2_9011=2#801#0
0030: _9009+2_9011=2#801#0
0031: _9009+2_9011=2#801#0
0032: _9009+2_9011=2#801#0
0033: _9009+2_9011=2#801#0
0034: _9009+2_9011=2#801#0
0035: _9009+2_9011=2#801#0
0036: _9009+2_9011=2#801#0
0037: _9009+2_9011=2#801#0
0038: _9009+2_9011=2#801#0
0039: _9009+2_9011=2#801#0
0040: _9009+2_9011=2#801#0
0041: _9009+2_9011=2#801#0
0042: _9009+2_9011=2#801#0
0043: _9009+2_9011=2#801#0
0044: _9009+2_9011=2#801#0
0045: _9009+2_9011=2#801#0
0046: _9009+2_9011=2#801#0
0047: _9009+2_9011=2#801#0
0048: _9009+2_9011=2#801#0
0049: _9009+2_9011=2#801#0
0050: _9009+2_9011=2#801#0
0051: _9009+2_9011=2#801#0
0052: _9009+2_9011=2#801#0
0053: _9009+2_9011=2#801#0
0054: _9009+2_9011=2#801#0
0055: _9009+2_9011=2#801#0
0056: _9009+2_9011=2#801#0
0057: _9009+2_9011=2#801#0
0058: _9009+2_9011=2#801#0
0059: _9009+2_9011=2#801#0
0060: _9009+2_9011=2#801#0
0061: _9009+2_9011=2#801#0
0062: _9009+2_9011=2#801#0
0063: _9009+2_9011=2#801#0
0064: _9009+2_9011=2#801#0
0065: _9009+2_9011=2#801#0
0066: _9009+2_9011=2#801#0
0067: _9009+2_9011=2#801#0
0068: _9009+2_9011=2#801#0
0069: _9009+2_9011=2#801#0
0070: _9009+2_9011=2#801#0
0071: _9009+2_9011=2#801#0
0072: _9009+2_9011=2#801#0
0073: _9009+2_9011=2#801#0
0074: _9009+2_9011=2#801#0
0075: _9009+2_9011=2#801#0
0076: _9009+2_9011=2#801#0
0077: _9009+2_9011=2#801#0
0078: _9009+2_9011=2#801#0
0079: _9009+2_9011=2#801#0
0080: _9009+2_9011=2#801#0
0081: _9009+2_9011=2#801#0
0082: _9009+2_9011=2#801#0
0083: _9009+2_9011=2#801#0
0084: _9009+2_9011=2#801#0
0085: _9009+2_9011=2#801#0
0086: _9009+2_9011=2#801#0
0087: _9009+2_9011=2#801#0
0088: _9009+2_9011=2#801#0
0089: _9009+2_9011=2#801#0
0090: _9009+2_9011=2#801#0
0091: _9009+2_9011=2#801#0
0092: _9009+2_9011=2#801#0
0093: _9009+2_9011=2#801#0
0094: _9009+2_9011=2#801#0
0095: _9009+2_9011=2#801#0
0096: _9009+2_9011=2#801#0
0097: _9009+2_9011=2#801#0
0098: _9009+2_9011=2#801#0
0099: _9009+2_9011=2#801#0
0100: _9009+_29011=2#801#0
0101: 9009+29011=2#801#0
    : 9009+29011=2#801#0
0000: 9009+29011=2#801#0
0001: 9009+29011=2#801#0
0002: 9009+29011=2#801#0
0003: 9009+29011=2#801#0
0004: 9009+29011=2#801#0
0005: 9009+29011=2#801#0
0006: 9009+29011=2#801#0
0007: 9009+29011=2#801#0
0008: 9009+29011=2#801#0
0009: 9009+29011=2#801#0
0010: 9009+29011=2#801#0
0011: 9009+29011=2#801#0
0012: 9009+29011=2#801#0
0013: 9009+29011=2#801#0
0014: 9009+29011=2#801#0
0015: 9009+29011=2#801#0
0016: 9009+29011=2#801#0
0017: 9009+29011=2#801#0
0018: 9009+29011=2#801#0
0019: 9009+29011=2#801#0
0020: 9009+29011=2#801#0
0021: 9009+29011=2#801#0
0022: 9009+29011=2#801#0
0023: 9009+29011=2#801#0
0024: 9009+29011=2#801#0
0025: 9009+29011=2#801#0
0026: 9009+29011=2#801#0
0027: 9009+29011=2#801#0
0028: 9009+29011=2#801#0
0029: 9009+29011=2#801#0
0030: 9009+29011=2#801#0
0031: 9009+29011=2#801#0
0032: 9009+29011=2#801#0
0033: 9009+29011=2#801#0
0034: 9009+29011=2#801#0
0035: 9009+29011=2#801#0
0036: 9009+29011=2#801#0
0037: 9009+29011=2#801#0
0038: 9009+29011=2#801#0
0039: 9009+29011=2#801#0
0040: 9009+29011=2#801#0
0041: 9009+29011=2#801#0
0042: 9009+29011=2#801#0
0043: 9009+29011=2#801#0
0044: 9009+29011=2#801#0
0045: 9009+29011=2#801#0
0046: 9009+29011=2#801#0
0047: 9009+29011=2#801#0
0048: 9009+29011=2#801#0
0049: 9009+29011=2#801#0
0050: 9009+29011=2#801#0
0051: 9009+29011=2#801#0
0052: 9009+29011=2#801#0
0053: 9009+29011=2#801#0
0054: 9009+29011=2#801#0
0055: 9009+29011=2#801#0
0056: 9009+29011=2#801#0
0057: 9009+29011=2#801#0
0058: 9009+29011=2#801#0
0059: 9009+29011=2#801#0
0060: 9009+29011=2#801#0
0061: 9009+29011=2#801#0
0062: 9009+29011=2#801#0
0063: 9009+29011=2#801#0
0064: 9009+29011=2#801#0
0065: 9009+29011=2#801#0
0066: 9009+29011=2#801#0
0067: 9009+29011=2#801#0
0068: 9009+29011=2#801#0
0069: 9009+29011=2#801#0
0070: 9009+29011=2#801#0
0071: 9009+29011=2#801#0
0072: 9009+29011=2#801#0
0073: 9009+29011=2#801#0
0074: 9009+29011=2#801#0
0075: 9009+29011=2#801#0
0076: 9009+29011=2#801#0
0077: 9009+29011=2#801#0
0078: 9009+29011=2#801#0
0079: 9009+29011=2#801#0
0080: 9009+29011=2#801#0
0081: 9009+29011=2#801#0
0082: 9009+29011=2#801#0
0083: 9009+29011=2#801#0
0084: 9009+29011=2#801#0
0085: 9009+29011=2#801#0
0086: 9009+29011=2#801#0
0087: 9009+29011=2#801#0
0088: 9009+29011=2#801#0
0089: 9009+29011=2#801#0
0090: 9009+29011=2#801#0
0091: 9009+29011=2#801#0
0092: 9009+29011=2#801#0
0093: 9009+29011=2#801#0
0094: 9009+29011=2#801#0
0095: 9009+29011=2#801#0
0096: 9009+29011=2#801#0
0097: 9009+29011=2#801#0
0098: 9009+29011=2#801#0
0099: 9009+29011=2#801#0
0100: 9009+29011=2#801#0
0101: 9009+29011=2#801#0
    : 9009+29011=2#801#0
converged


================ post ================
0000: 9009+29011=2#801#0
0001: 9009+29011=2#8020
0002: 9009+29011=38020
0003: 9009+29011=38020
0004: 9009+29011=38020
0005: 9009+29011=38020
0006: 9009+29011=38020
0007: 9009+29011=38020
0008: 9009+29011=38020
0009: 9009+29011=38020
0010: 9009+29011=38020
    : 9009+29011=38020
0000: 9009+29011=38020
0001: 9009+29011=38020
0002: 9009+29011=38020
0003: 9009+29011=38020
0004: 9009+29011=38020
0005: 9009+29011=38020
0006: 9009+29011=38020
0007: 9009+29011=38020
0008: 9009+29011=38020
0009: 9009+29011=38020
0010: 9009+29011=38020
    : 9009+29011=38020
converged


9009+29011=38020
9009+29011=38020

じりじりポインタが上がっていくのがかっこいいでしょ?

休講・補講情報を見やすくする

TUT 制作物

この記事は、TUT Advent Calendar 2016 - Adventar の2日目の記事です。

2017年1月11日 追記

冬期休業中(1月1日ごろ?)からPC版の休講・補講情報ページが以下に復活しています。

豊橋技術科学大学教務システム - 連絡

私が作った休講・補講情報bot: @tucas_botもここからデータを取って元気に動いています。


前置き

教務システムが刷新され、休講・補講のお知らせページも新しくなりましたね。

Before
旧ページ
After
新ページ

……明らかに劣化してません?
わあ、オシャレ。i-modeに対応したんですね!

本題

自分に関係のない講義を非表示にするブックマークレットを作りました。赤字のところは適宜書き換えてください。

javascript:(document.getElementById("Form_LctSchedeule_List").innerHTML.replace(/(?:(?:\d~)?\d限<br>\n.+<br>\n担当教員:.*<br>\n開講年次:(?!.*B1.+<br>\n開講学科:.*機械).+<br>\n開講学科:.+\n(?:学生への連絡:.*<br>\n補講の予定:.*<br>\n|教室:.*<br>\n備考:.*<br>\n))/g,""));

innerHTMLを弄っているので、動かすと前日/翌日に移ることができなくなるバグがあります。

蛇足

新ページですが、構造化されていなかったり、1日分ずつしか見られない上に、input要素からPOSTメソッドを叩くことによって別の日へ移っています。というかですね、これ旧システムの携帯版ですよね?

元々は、シラバス・休講・補講情報統合API(TuCas)とかいうのを作って、AdCalで紹介するつもりだったのですがこういう状況で、スクレイピングの方法を模索中です。Bot(@tucas_bot)くらいは復旧したいなあ…


明日はtakunokoさんの「TuT休講情報をより見やすく便利に!」です。