web-dev-qa-db-ja.com

アイルランドのエールコードの検証

アイルランドのエールコード形式の検証のベストプラクティスがあるかどうか疑問に思っています。 JavaScriptでREGEXを使用するこれまでの私の最善の試みは、11ページにある公式仕様ここに基づいた次のとおりです。

(ドキュメントのページ番号に基づく11ページ、または表紙を含める場合は12ページ)

/^[A,C,D,E,F,H,K,N,P,R,T,V,W,X,Y]{1}[0-9]{1}[0-9,W]{1}[\ \-]?[0-9,A,C,D,E,F,H,K,N,P,R,T,V,W,X,Y]{4}$/

ここでエールコード関連の質問が見つからなかったので、これを開いて他の人の考えを確認し、誰もが思いつくことができるより良い/より短い/より効率的なパターンを確認したいと思いました。

編集:@Asunezの回答に従ってコンマを削除しました。

/^[ACDEFHKNPRTVWXY]{1}[0-9]{1}[0-9W]{1}[\ \-]?[0-9ACDEFHKNPRTVWXY]{4}$/
19
ConorLuddy

@Manwalの答えは正確に正しいことをしていないので、OPの正規表現を短くする私の試みは次のとおりです。

(?:^[AC-FHKNPRTV-Y][0-9]{2}|D6W)[ -]?[0-9AC-FHKNPRTV-Y]{4}$

これは基本的に正規表現ですが、いくつかの変更があります。

  • カンマを削除しました。 []括弧内の項目をリストするためにコンマは必要ありません。
  • 可能な場合、およびスペースを節約できる範囲を追加しました(C-FV-Y)。他の場所では、正規表現が短くならないため、範囲を追加することは有益ではありません。
  • スペースを脱出する必要はありません。正規表現の「」は文字通りです。
  • また、ダッシュが文字クラスの最後の文字である場合は、ダッシュをエスケープする必要はありません(角括弧)
  • 正規表現の最初の部分は非キャプチャグループになり、[〜#〜]または[〜#〜]を3番目の位置の唯一の可能な文字で許可します。 「D6W」の場合。

D6Wを後読みだけで処理することも可能ですが、これは正規表現というよりは芸術です。

正規表現のデモを参照してください: ここ

文字クラスをnotに反転して、指定された文字を含めることもできます。正規表現が短くなることはありませんが、注目に値します。ただし、他の文字(ドット、コンマなど)も含まれていないことを確認する必要があります。 \Wトークンを追加して行います。

あなたはそれを試すことができます ここ

14
Asunez

製品ガイドの第1.5.4章によると、許可される標識は次のとおりです。

_-----------------------------------------------------------------------
|     Component     | Position | Allowed characters                   |
-----------------------------------------------------------------------
| Routing Keys      |    1     | A,C,D,E,F,H,K,N,P,R,T,V,W,X,Y        |
-----------------------------------------------------------------------
| Routing Keys      |    2     | 0-9                                  |
-----------------------------------------------------------------------
| Routing Keys      |    3     | 0-9 with the exception of W for D6W  |
-----------------------------------------------------------------------
| Unique Identifier |    4     | 0-9, A,C,D,E,F,H,K,N,P,R,T,V,W,X,Y   | 
-----------------------------------------------------------------------
| Unique Identifier |    5     | 0-9, A,C,D,E,F,H,K,N,P,R,T,V,W,X,Y   | 
-----------------------------------------------------------------------
| Unique Identifier |    6     | 0-9, A,C,D,E,F,H,K,N,P,R,T,V,W,X,Y   | 
-----------------------------------------------------------------------
| Unique Identifier |    7     | 0-9, A,C,D,E,F,H,K,N,P,R,T,V,W,X,Y   | 
-----------------------------------------------------------------------
_

_D6W_コードである1つの特定の状況を除いて、すべてのルーティングキーには文字と2桁の数字が含まれている必要があります。

したがって、_A5W_、_C6W_、_V0W_で始まるコードは無効です。

章によると_1.5.1 Recommendations for Storage and Presentation_

  • エールコードは、ITシステム(A65F4E2)では常に7つの大文字の単一の文字列として保存する必要があります。
  • エールコードは、文房具、郵便物、コンピューターフォームなどで、スペースで区切られた2つの部分として常に大文字で表示する必要があります。つまり、A65 F4E2であり、A65F4E2ではありません。

データベースに保存されているコードは、spaceまたはdashで区切るのではなく、spaceで区切る必要があり、表示するためだけに使用してください。

仮定すると、正しい正規表現は次のようになります。

/([AC-FHKNPRTV-Y]\d{2}|D6W)[0-9AC-FHKNPRTV-Y]{4}/

正規表現オンラインテスター

エールコードガイド

10
hywak

Char Bを避けてこの回答を更新しました。あなたはこれを試すことができます:

/^[AC-Y]{1}[0-9]{1}[0-9W]{1}[ \-]?[0-9AC-Y]{4}$/

説明:

^ assert position at start of the string
[AC-Y]{1} match a single character present in the list below
Quantifier: {1} Exactly 1 time (meaningless quantifier)
A the literal character A (case sensitive)
C-Y a single character in the range between C and Y (case sensitive)
[0-9]{1} match a single character present in the list below
Quantifier: {1} Exactly 1 time (meaningless quantifier)
0-9 a single character in the range between 0 and 9
[0-9W]{1} match a single character present in the list below
Quantifier: {1} Exactly 1 time (meaningless quantifier)
0-9 a single character in the range between 0 and 9
W the literal character W (case sensitive)
[ \-]? match a single character present in the list below
Quantifier: ? Between zero and one time, as many times as possible, giving back as needed [greedy]
  the literal character  
\- matches the character - literally
[0-9AC-Y]{4} match a single character present in the list below
Quantifier: {4} Exactly 4 times
0-9 a single character in the range between 0 and 9
A the literal character A (case sensitive)
C-Y a single character in the range between C and Y (case sensitive)
$ assert position at end of the string
4
Manwal