web-dev-qa-db-ja.com

複数の区切り文字に基づいて文字列を分割する

複数の文字列をセパレータとしてjqueryで文字列を分割する方法 を参照して、複数の区切り文字に基づいて文字列を分割しようとしました

複数の区切り文字があるので、

var separators = [' ', '+', '-', '(', ')', '*', '/', ':', '?'];
var tokens = x.split(new RegExp(separators.join('|'), 'g'));​​​​​​​​​​​​​​​​​

しかし、私はエラーが発生しています

Uncaught SyntaxError: Invalid regular expression: / |+|-|(|)|*|/|:|?/: Nothing to repeat 

解決方法

33
Okky

正規表現関連の文字+、-、(、)、* 、?にはエスケープが必要ですか?

var x = "adfds+fsdf-sdf";

var separators = [' ', '\\\+', '-', '\\\(', '\\\)', '\\*', '/', ':', '\\\?'];
console.log(separators.join('|'));
var tokens = x.split(new RegExp(separators.join('|'), 'g'));
console.log(tokens);

http://jsfiddle.net/cpdjZ/

51
melc

これは動作するはずです:

_var separators = [' ', '+', '(', ')', '*', '\\/', ':', '?', '-'];
var tokens = x.split(new RegExp('[' + separators.join('') + ']', 'g'));​​​​​​​​​​​​​​​​​
_

生成された正規表現は正規表現文字クラス:/[ +()*\/:?-]/gを使用します

この方法では、何もエスケープする必要はありません。

10
anubhava

以下は、同じことを達成する簡単な方法です。

var tokens = x.split(new RegExp('[-+()*/:? ]', 'g'));​​​​​​​​​​​​​​​​​

ご了承ください -は最初に来る必要があります(またはエスケープする必要があります)、そうでない場合はrange演算子(たとえば、a-z

6
samjudson

ほとんどの正規表現言語で特別な意味を持っているため、+、*、および?をエスケープする必要があると思います

2
Friso

これは、+*などの文字が正規表現で特別な意味を持つためです。

結合を|から|\に変更すると、リテラルをエスケープして問題ないはずです。

1
Roy Dictus