From 8461ce5394910d71b383a0a6a89d64bf367b152a Mon Sep 17 00:00:00 2001 From: Harukoto Date: Sun, 23 Aug 2026 22:17:13 +0900 Subject: [PATCH 1/2] =?UTF-8?q?=E5=86=B7=E7=AC=91=E3=83=91=E3=82=BF?= =?UTF-8?q?=E3=83=BC=E3=83=B3(=E3=81=A3=E3=81=9F=E3=81=8F/=E3=82=88?= =?UTF-8?q?=E3=81=9B=E3=82=84=E3=81=84/=E3=81=82=E3=81=9F=E3=81=BC?= =?UTF-8?q?=E3=81=86=E3=82=88/=E3=81=A6=E3=82=84=E3=82=93=E3=81=A7?= =?UTF-8?q?=E3=81=84/=E3=81=9D=E3=81=86=E3=81=84=E3=81=86=E3=83=8E?= =?UTF-8?q?=E3=83=AA)=E3=82=92=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Cursor --- src/lib/regex.ts | 2 +- test/regex.test.ts | 18 ++++++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/src/lib/regex.ts b/src/lib/regex.ts index cbc008d..e1f2512 100644 --- a/src/lib/regex.ts +++ b/src/lib/regex.ts @@ -5,7 +5,7 @@ * 203C FE0F: ‼️ */ export const regexStrict: RegExp = - /(?:\u{1F605}|\u{1F923}|\u{203C}\u{FE0F}?|(?:[きキキ][ちチチ]|[おぉオォオォ][うぅウゥウゥ]|[うぅウゥウゥ][おぉオォオォ]|[どドド][わゎワヮ])[-ーー~っッッ]*(?:[ww]+|(?:(?:爆笑)|笑)+|[((]笑[))] )|(?:爆笑){2,}|(?:冷笑){2,}|[((]笑[))])/gu; + /(?:\u{1F605}|\u{1F923}|\u{203C}\u{FE0F}?|(?:[きキキ][ちチチ]|[おぉオォオォ][うぅウゥウゥ]|[うぅウゥウゥ][おぉオォオォ]|[どドド][わゎワヮ]|[っッッ][たタタ][くクク]|[よヨヨ][せセセ][やヤヤ][いイイ]|[あアア][たタタ](?:ぼ|ボ|ボ)[うウウ][よヨヨ]|[てテテ][やヤヤ][んンン](?:で|デ|デ)[いイイ])[-ーー~っッッ…]*(?:[ww]+|(?:(?:爆笑)|笑)+|[((]笑[))] )|あ[ぁあ]?、?そういう[ノノ][リリ][…]*[ww]+|(?:爆笑){2,}|(?:冷笑){2,}|[((]笑[))])/gu; /** * 1F4A6: 💦 */ diff --git a/test/regex.test.ts b/test/regex.test.ts index 12b7a35..6037ef5 100644 --- a/test/regex.test.ts +++ b/test/regex.test.ts @@ -47,6 +47,24 @@ const cases: Case[] = [ { content: "どわー爆笑爆笑", expected: true }, { content: "お、おうw", expected: true }, { content: "きちーw", expected: true }, + { content: "ったくw", expected: true }, + { content: "ったくw", expected: true }, + { content: "ったく…w", expected: true }, + { content: "ッタクw", expected: true }, + { content: "ッタクw", expected: true }, + { content: "よせやいw", expected: true }, + { content: "よせやいw", expected: true }, + { content: "ヨセヤイw", expected: true }, + { content: "あたぼうよw", expected: true }, + { content: "あたぼうよw", expected: true }, + { content: "アタボウヨw", expected: true }, + { content: "あたボうよw", expected: true }, + { content: "てやんでいw", expected: true }, + { content: "てやんでいw", expected: true }, + { content: "テヤンデイw", expected: true }, + { content: "あぁ、そういうノリ…w", expected: true }, + { content: "あそういうノリw", expected: true }, + { content: "あぁそういうノリw", expected: true }, // 複数マッチ { content: "うおうおうおw、爆笑爆笑", expected: ["うおw", "爆笑爆笑"] }, { From 812c2e2e0ab4efa8db3c337cb376adbc9eb065ff Mon Sep 17 00:00:00 2001 From: "otoneko." Date: Sun, 23 Aug 2026 23:12:56 +0900 Subject: [PATCH 2/2] =?UTF-8?q?patterns.ts=E3=81=AE=E3=83=87=E3=83=BC?= =?UTF-8?q?=E3=82=BF=E9=A7=86=E5=8B=95=E6=96=B9=E5=BC=8F=E3=81=AB=E5=90=88?= =?UTF-8?q?=E3=82=8F=E3=81=9B=E3=81=A6=E5=86=8D=E5=AE=9F=E8=A3=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit main側でsrc/lib/regex.tsを手書き正規表現からsrc/lib/patterns.tsの データ駆動方式にリファクタリングしたため、このPRの提案(ったく/よせやい/ あたぼうよ/てやんでい/そういうノリ)を現在の構造に合わせて書き直しました。 - ったく: phrase-mattaku として既に存在(relaxedのみ) - そういうノリ: phrase-sonna-nori として既に存在(より広くマッチする形) - よせやい/あたぼうよ/てやんでい: patterns配列に新規追加 (SE/TE/BOのモーラ定数を追加し、既存のstem()ヘルパーで組み立て) Co-authored-by: Harukoto --- src/lib/patterns.ts | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/src/lib/patterns.ts b/src/lib/patterns.ts index c274bc9..68b8345 100644 --- a/src/lib/patterns.ts +++ b/src/lib/patterns.ts @@ -27,14 +27,17 @@ const GO = "(?:ご|ゴ|ゴ)"; const SA = "[さササ]"; const SHI = "[しシシ]"; const SU = "[すスス]"; +const SE = "[せセセ]"; const SO = "[そソソ]"; const TA = "[たタタ]"; const CHI = "[ちチチ]"; const SMALL_TSU = "[っッッ]"; +const TE = "[てテテ]"; const DE = "(?:で|デ|デ)"; const DO = "(?:ど|ド|ド)"; const NA = "[なナナ]"; const NO = "[のノノ]"; +const BO = "(?:ぼ|ボ|ボ)"; const MU = "[むムム]"; const MO = "[もモモ]"; const YA = "[やヤヤ]"; @@ -299,6 +302,27 @@ export const patterns: PatternDefinition[] = [ source: stem(SO, U, I, U, NO, RI, "[…\\.・・]*"), samples: ["あぁ、そういうノリ...w理解した"], }, + // 「うおwからのけけっwからのひひっwからのどわーwからの…ったくwからの + // よせやいwからのあらよっとwからのてやんでいw…」のような冷笑チェーン + // ネタで使われる定型フレーズ + { + id: "phrase-yoseyai", + strict: true, + source: stem(YO, SE, YA, I), + samples: ["よせやいw"], + }, + { + id: "phrase-atabouyo", + strict: true, + source: stem(A, TA, BO, U, YO), + samples: ["あたぼうよw"], + }, + { + id: "phrase-teyandei", + strict: true, + source: stem(TE, YA, N, DE, I), + samples: ["てやんでいw"], + }, // --- フレーズ系(relaxedのみ: 単体では冷笑以外の文脈でも頻出するため) --- {