web-dev-qa-db-ja.com

.match(regex)を使用したJavaScript分割文字列

Mozilla Developer Networkのfunction split()から:

Split()メソッドは新しい配列を返します。

見つかった場合、区切り文字が文字列から削除され、部分文字列が配列で返されます。セパレータが見つからないか省略された場合、配列には文字列全体で構成される1つの要素が含まれます。 separatorが空の文字列の場合、strは文字の配列に変換されます。

Separatorがキャプチャ括弧を含む正規表現である場合、セパレータが一致するたびに、キャプチャ括弧の結果(未定義の結果を含む)が出力配列にスプライスされます。ただし、すべてのブラウザがこの機能をサポートしているわけではありません。

次の例を見てください。

_var string1 = 'one, two, three, four';
var splitString1 = string1.split(', ');
console.log(splitString1); // Outputs ["one", "two", "three", "four"]
_

これは本当にクリーンなアプローチです。私は正規表現と少し異なる文字列で同じことを試しました:

_var string2 = 'one split two split three split four';
var splitString2 = string2.split(/\ split\ /);
console.log(splitString2); // Outputs ["one", "two", "three", "four"]
_

これは最初の例と同じように機能します。次の例では、3つの異なる区切り文字を使用して、文字列をもう一度変更しました。

_var string3 = 'one split two splat three splot four';
var splitString3 = string3.split(/\ split\ |\ splat\ |\ splot\ /);
console.log(splitString3); // Outputs ["one", "two", "three", "four"]
_

ただし、現在のところ、正規表現は比較的複雑です。さまざまな区切り文字をグループ化できますが、結果にはこれらの区切り文字が含まれます。

_var string4 = 'one split two splat three splot four';
var splitString4 = string4.split(/\ (split|splat|splot)\ /);
console.log(splitString4); // Outputs ["one", "split", "two", "splat", "three", "splot", "four"]
_

そこで、グループを離れるときに正規表現からスペースを削除してみましたが、あまり役に立ちませんでした。

_var string5 = 'one split two splat three splot four';
var splitString5 = string5.split(/(split|splat|splot)/);
console.log(splitString5);
_

ただし、正規表現のかっこを削除すると、分割文字列の区切り文字がなくなってしまいます。

_var string6 = 'one split two splat three splot four';
var splitString6 = string6.split(/split|splat|splot/);
console.log(splitString6); // Outputs ["one ", " two ", " three ", " four"]
_

もう1つの方法は、match()を使用して区切り文字を除外することですが、逆先読みがどのように機能するのか本当に理解していません。

_var string7 = 'one split two split three split four';
var splitString7 = string7.match(/((?!split).)*/g);
console.log(splitString7); // Outputs ["one ", "", "plit two ", "", "plit three ", "", "plit four", ""]
_

そもそもWord全体とは一致しません。正直なところ、ここで何が起こっているのかも正確にはわかりません。


結果に区切り文字を含めずに、正規表現を使用して文字列を適切に分割するにはどうすればよいですか?

13
Audite Marlow

非キャプチャグループを分割正規表現として使用します。非キャプチャグループを使用すると、分割された一致は結果の配列に含まれません。

var string4 = 'one split two splat three splot four';
var splitString4 = string4.split(/\s+(?:split|splat|splot)\s+/);
console.log(splitString4);
// Output => ["one", "two", "three", "four"]
15
anubhava

matchを使用したい場合は、次のように書くことができます

'one split two split three split four'.match(/(\b(?!split\b)[^ $]+\b)/g)
["one", "two", "three", "four"]

それは何ですか?

  • \b単語の境界に一致

  • (?!split\b)否定的な先読み、単語がでないかどうかを確認split

  • [^ $]+スペースまたは$以外の文字列の末尾に一致します。このパターンは単語に一致します。先読みにより、一致するものがsplitではないことが保証されます。

  • \b単語の末尾に一致します。

1
nu11p01n73R