2017-10-12 13 views
1

コード例:
https://codepen.io/Trost/pen/KXBRbY
両方のフィールドに1つの記号を入れてみてください。
私は何が間違っている得ることができません。 https://regex101.comでこれらの正規表現をテストすると、それらは同じに見えます。HTML正規表現パターン:[ d s - ] {3}は動作しますが、[ d- s] {3}は動作しません。どうして?

<form> 
    Works: <input type="text" name="country_code" pattern="[\d\s-]{3}" title="-23" required> 
    <input type="submit"> 
</form> 
<form> 
    Bug: <input type="text" name="country_code" pattern="[\d-\s]{3}" title="- 3" required> 
    <input type="submit"> 
</form> 
+2

'-'は' [] '文字クラスの途中で使用されると特別な意味を持ちます。しかし、 '\ d'と' \ s'を中心に、実際にはあまり意味がないので、実装によっては失敗する可能性があります。 '[\ d \ s-]'ではクラスの最後にあります。つまり、特別な意味はありません。 –

+1

PCREオプションをregex101.comでテストし、HTML5パターンでは 'u'オプションを付けたES6正規表現として解析するからです。 –

答えて

1

本当の根本的な原因は、正規表現[\d-\s]pattern HTML5属性で使用されている、とChromeとFirefoxの最新バージョンでu修飾子とES2015互換の正規表現としてコンパイルされていることです。結果として、より厳密なエスケープ規則がUnicode正規表現パターンに対して存在することになります。それが何を意味

enter image description here

は、charが明確に解析できない時はいつでも、それは誤りです。 charがエスケープされてもエスケープする必要がない場合は、もう一度エラーになります。あなたはuベースの正規表現内の文字クラスに逃れること

文字は+$^*()|\[].?-{}(ありますthis source参照)。 -が文字クラスの先頭/末尾にある場合、それはリテラルハイフンとしてのみ解析できるため、エスケープされません。

2つの短縮文字クラスの間で、エスケープされていない-は、ユーザーエラーとして扱われるため、エラーが発生します。

先頭/末尾にハイフンを置くか(常に最適なオプションです)、それを文字クラスの内部でエスケープしてください(そして文字クラスの外にエスケープしないでください)。

+0

ありがとうございます。私はシンボル範囲を定義するのに " - "が使用されていることを忘れていました。そして、それがregex101.comで働いたという事実は私をさらに混乱させました。 TIL:JSコンソールで/regex/.test("teststring ")を使ってregexをテストすることができます。 – Trost

+0

@Trost [Regex101には独自のバグもあります。](https://regex101.com/r/cvFxtw/1) –

1

次の2つの異なるものを定義: - aからzまでのすべての文字

  • [a-z]は、範囲の定義です。
  • [az-]は、a,zおよび -の3つの要素のセットの定義です。ここ
関連する問題