2

文字列の句読点を選択する正規表現を書いていますが、予期しない動作が発生しています。

ix = regexp('FGFR4','[~!@#$%^&*()-=+{}\|;:''",<.>/?\[]')
ix =

     [5]

ix = regexp('FGFR4','[~!@#$%^&*()-+{}\|;:''",<.>/?\[]') %note, the '=' is gone
ix =

     []

したがって、「=」は数字の 4 と一致しているように見えます。私が期待するのは、「=」記号のみが次のように一致することです。

ix = regexp('FOO=SPAM','[~!@#$%^&*()-=+{}\|;:''",<.>/?\[]')
ix =

     [4]

何が起きてる?

4

1 に答える 1

4

問題はそれではなく、=その-前にあります。)から=(ASCII 順)までのすべての文字の範囲を作成します。=を削除してもこれが問題にならない理由は、ASCII 順序で+4にあるため、範囲には が含まれません4(実際には)、 、*のみが含まれ+ます*

3 つのソリューション:

  1. ハイフンをエスケープします。

    [~!@#$%^&*()\-=+{}\|;:''",<.>/?\[]
    
  2. または、文字クラスの最後に配置します。

    [~!@#$%^&*()=+{}\|;:''",<.>/?\[-]
    
  3. この文字セットを正確に使用することを確認したい場合を除き...したがって、スペース、文字、数字(またはアンダースコア)以外の何かに一致する場合は、これを使用することもできます:

    [^\w\s]
    

    アンダースコア、文字、数字、空白文字以外の任意の文字に一致します。

于 2012-11-14T18:46:32.543 に答える