LoginSignup
3
6

More than 5 years have passed since last update.

正規表現を使ってコミュニケートを柔軟にする in 伺か

Last updated at Posted at 2016-12-15

よくあるコミュニケートの問題

ゴーストのコミュニケート反応を見ていると、たまに「こんにちは」で反応しても「こんにちはー!」や「こんちは!」など判定キーワードが少しでも違うと反応しないものがあります。
そんな場合は、正規表現を使ってコミュニケートを実装するとより柔軟に対応できます。

つかいかた

YAYAではRE_SEARCH(入力, 正規表現)で入力に正規表現にマッチする文字列が含まれているかどうかを判定できます。
たとえば次のような使い方ができます:(inputboxなどでreference[0]にユーザーの入力が格納される場合を想定)

if (RE_SEARCH(reference[0], 'こんに?ち[はわ]|今日[はわ]|コンニチ[ハワ]')){
    <<"
    テスト00:こんにちは、%(username)。
    ">>
}

......意味が分からない!って人は次の解説をどうぞ

正規表現って?

文字列のパターンを記述するための表記法です。YAYA以外にもRubyやPerlなどに標準ライブラリとして搭載されています。また、テキストエディタの色分けなどもこれを利用して作られています。

普通の文字列

その文字が含まれていればマッチします。例えば「やあ」なら「やあ、なにしてるの?」や「いやあああ」などにマッチします。

この中のどれか(or)

「|」を使います。意味は条件分岐のorと同じです。例えば「こんにちは|今日は|コンニチハ」は「こんにちは!」や「今日は、何してるの?」「コンニチハオヒガラモヨク」などにマッチします。

文頭、文末

^AAAでAAAが文頭の場合、AAA$でAAAが文末の場合として判定します。例えば「^やあ」なら「やあ、調子はどう?」や「やあやあ我こそは」にマッチします。
また、「かよ$」なら「またおまえかよ」や「ライフはわずかよ」などにマッチします。
両方を使った場合、つまり「^はい$」なら文頭かつ文末なので「はい」しかマッチしません。
($は演算子の前すべての文字(^は後)で判定されます。従って実際に使う場合は後述する「()」でマッチさせたい部分を囲っておくことを推奨します)

どれか1文字

[]で、[]の中の文字どれか1文字、という意味になります。例えば「こんにち[はわ]」なら「こんにちはー」や「こんにちわ!!!」などにマッチします。
全角/半角の表記ブレを吸収する用途にも使えます。

なんでもいいから1文字

「.」でなにか1文字を表します。例えば「これが...だ!」なら「これがスイカだ!」や「これがとうふだ!」などにマッチします。

繰り返し

「+」は直前の1文字が1回以上連続する場合、「*」は直前の1文字が0回以上連続する場合にマッチします。例えば
「は+」なら「ははは」や「あはははは」、「あは!」などにマッチします。
「あう*」なら「あ」や「あうううう」などにマッチします。

あってもいいしなくてもいい

「?」で「直前の1文字があってもなくてもいい」という意味になります。例えば「こんに?ちは」なら「こんちはー」や「こんにちは」などにマッチします。

グループ分け

上述の演算子の評価順序は丸括弧「()」で指定できます。例えば
「(もち)+」なら「おもちもちもち」や「もち」などにマッチします。
「(好き|すき)です」なら「好きですよ」や「だいすきです」などにマッチします。

エスケープシーケンス

演算子として使われてしまっている文字を判定として使いたい場合はエスケープシーケンスとしてバックスラッシュ「\」を使います。
例えば「なに(\?|?)」は「えーっと、なに?」や「なに?」などにマッチします。

かつ(and)

正規表現にはandに対応する演算子は用意されていません。しかし以上の演算子を組み合わせることでandを表現することができます。具体的には
               ^(?=.*りんご)(?=.*みかん)
で「文中に「りんご」と「みかん」(連続している必要はない)が両方含まれている場合にマッチ」という意味になります。例えば
^(?=.*(私|わたし|僕|ぼく|俺|おれ))(?=.*(\?|?)$)で「僕は何をしてるんだ?」や「それって私の本?」などにマッチします。

最初のコードの意味

これらを踏まえて、最初のコードに書かれていた正規表現を翻訳すると入力された文字列の中に「こんにちはorこんちはorこんにちわorこんちわor今日はor今日わorコンニチハorコンニチワ」が含まれていたならtrue、含まれていないならfalseという意味になります。
このように正規表現をうまく使えば、だいぶすっきりと文章の判定が可能になります。
ぜひ、ゴーストのコミュニケート反応に使ってみよう

Tips

if (RE_SEARCH(reference[0], '(なの|の|かしら|か)(?|\?)?$')){
    <<"
    テスト08:そうなんじゃない?
    ">>

    <<"
    テスト08:さあ、なんだろうね?
    ">>
}

とするとほとんどのTrue/Falseを問う疑問文に「そうなんじゃない?」または「さあ、なんだろうね?」と答えるので、"会話が成り立っているように"みえる。
コミュニケート反応の条件分岐の最後の方でこういったものを入れておくと、自然に会話が成り立ちやすい

3
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
6