前回、質問内容に漏れがあり再現することができませんでした。
https://teratail.com/questions/239924
行いたい正規表現は以下の通りで試行錯誤しているのですが、うまくいかないので教えていただきたいです。
文字列 | 期待値 |
---|---|
漢字 | OK |
カタカナ | OK |
漢字カタカナ | OK |
あ漢字カタカナ | NG |
漢字あカタカナ | NG |
漢字カタカナあ | NG |
半角スペース | 期待値 |
---|---|
漢字カタカナ | NG |
漢字カタカナ | NG |
漢字 カタカナ | OK |
漢字 カタカナ | NG |
漢字 カ タカナ | OK |
漢字 カ タカナ | NG |
漢字カタカナ | NG |
漢字カタカナ | NG |
全角スペース | 期待値 |
---|---|
漢字カタカナ | NG |
漢字カタカナ | NG |
漢字 カタカナ | OK |
漢字 カタカナ | NG |
漢字 カ タカナ | OK |
漢字 カ タカナ | NG |
漢字カタカナ | NG |
漢字カタカナ | NG |
基本的な許容文字形式に加え、文字列の間にあるスペースは1つまでとしたいのです。
追記
細かいところは以下のように定めたいと思います。
要件
漢字とカタカナの入力を許容し、
全角ハイフン(長音)と全角スペースと半角スペースも許容するが
全角ハイフン(長音)と全角スペースと半角スペースについては連続で1文字までしか入力できないものとする。
漢字の取り扱い
- ここでいう漢字とは、全角で1文字を表すものとする。
- ㍻などのような環境依存文字は漢字と見做さない。
- 吉野家などのような
吉
のような文字列でも人間が見て全角で1文字を表す漢字だと判断できるものは漢字と見做す。
カタカナの取り扱い
- ここでいうカタカナとは、全角で1文字を表すものとし、以下のみをカタカナとして取り扱う。
清音
アイウエオ
カキクケコ
サシスセソ
タチツテト
ナニヌネノ
ハヒフヘホ
マミムメモ
ヤユヨ
ラリルレロ
ワヰヱヲ
ン
濁音
ガギグゲゴ
ザジズゼゾ
ダヂヅデド
バビブベボ
ヴ
半濁音
パピプペポ
その他
ヴ
ァィゥェォ
ヵヶッ
ャュョ
ヮ
以下は漢字で変換できるためカタカナとは認めない。(漢字とするかカタカナとするか悩ましい)
ヵヶ
スペースの取り扱い
- 文頭の全角及び半角スペースは許容しない。
- 文末の全角及び半角スペースは許容しない。
- 文中の全角及び半角スペースは2文字連続に限り許容しないが、1文字でづつであれば文中何度出現しても許容する。
※以下に例を示すが、全角スペースも同様の扱いとする。
テスト文字列 | 期待値 |
---|---|
漢字 カタカナ | OK |
漢字 カタカナ | NG |
漢字 カ タカナ | OK |
漢字 カ タカナ | NG |
漢 字 カ タ カ ナ | OK |
漢 字 カ タ カ ナ | NG |
全角ハイフン(長音)の取り扱い
- 文中の全角ハイフン(長音)は2文字連続に限り許容しないが、1文字でづつであれば文中何度出現しても許容する。
- 全角ハイフン(長音)はカタカナとして表現できる文中にしか存在してはならず、カタカナの文頭には含んではならないが文末には含むことができる。
- 長音はひらがなかカタカナまでは区別する必要はなく、人間が全角ハイフンだとわかれば良い(ここは、あえて曖昧さを残す)
テスト文字列 | 期待値 |
---|---|
漢ー字ギータ | NG |
漢字ギータ | OK |
漢字ギーター | OK |
漢字ギーーター | NG |
漢字ギター | OK |
漢字ーギター | NG |
漢字ギータ | OK |
ギーター漢ー字 | NG |
ギーター漢字 | OK |
ギーーター漢字 | NG |
ギター漢字 | OK |
ーギター漢字 | NG |
検証方法
カスタムルールとしてグローバルに使いまわしたいため、以下の形式のコードでtest関数を用いてチェックするものとする。
const pattern = /^([ァ-ン一-龥][ ]?)*(((([ァ-ン]|ー)[ ]?)*([ァ-ン]|ー))|[一-龥])$/ console.log(pattern.test(value))
正規表現でここまで苦戦するとは思ってなかったので、連続スペースとかハイフンかと、もうサーバー側で修正した方が早いかも。
フロント側でもきっちりやりたいのは単なる自己満なので。。。
なんだか手を出しちゃいけないものにハマっていってる気がする。
最終追記
既存の一致項目に影響がないまま、項33~43までの期待値と結果が一致することで良しとしたいと思います。
https://codepen.io/postman_tyo/pen/vYOOLNL