1

この次の空白を解決するための最良の方法は何ですか?

var string = 'hi this is a string with some !things in it"
var index = string.indexOf('!')
var afterbang = string.substring(index, [NEXT SPACE])

結果:物事

4

5 に答える 5

4

正規表現ですべてを行うことができます。

var afterbang = string.replace(/.*!(\S*).*/, "$1");

これは、感嘆符に一致し、その後に非空白がいくらか続くこと\Sを意味します(つまり\s、小文字の「s」は空白に一致し、大文字の「s」はその逆になります)。非空白の一致は、正規表現の一致プロセスが一致のその部分を収集するように括弧で囲まれています。最後に、.replace()最初に一致したグループを返す必要があることを示す2番目のパラメーター。これは、最初の感嘆符の直後の非空白文字のコレクションになります。

編集—エラーでごめんなさい—今修正しました。.*入力した元のコードでは、残りの文字列もすべて残り、感嘆符のみが削除されます:-)他のすべてを確実に削除するために、先頭と末尾の式を含めるように更新しました。

そのようなすべての部分文字列(つまり、「!」のすべての出現とそれに続くいくつかの非空白文字)を見つける必要がある場合、物事はもう少し複雑になります。個人的には、JavaScriptで関数をの2番目の引数として渡すことができるという事実を利用します.replace()。これを行うと、一致したグループが引数として関数に渡されます。

var collection = [];
string.replace(/!(\S*)/g, function(_, bangWord) {
  collection.push(bangWord);
});

その後、配列「コレクション」にはすべての一致が含まれます。正規表現の接尾辞「g」により、文字列で見つからなくなるまで、前回の一致の後に毎回開始されて、一致が何度も繰り返されます。

(関数には、単なるプレースホルダーである「_」と呼ばれるダミーの最初のパラメーターがあります。関数の最初のパラメーターは、常に正規表現全体からの完全一致です。2番目以降の引数は、括弧で囲まれたグループからのものです。この場合、最初の引数は感嘆符を含む文字列になり、2番目の引数はそれを含まない部分文字列になります。)

于 2012-10-24T16:22:24.413 に答える
3
var s = "hi this is a string with some !things in it";
var index = s.indexOf('!')
var afterbang = s.substring(index, s.indexOf(' ', index));

​

私は実際、あなたが気にかけている特定の開始インデックスをすでに持っていると仮定しています。そうでない場合は、正規表現の方が理にかなっています。

var s = "hi this is a string with some !things in it";
var afterbang = s.match(/!.+?\s+/);
alert(afterbang)
​
于 2012-10-24T16:23:28.913 に答える
0

これを試して;

var s = "hi this is a string with some !things in it";
var re = /(.*)!([^ ]*)/; // regex capturing two groups split over '!'
var m = re.exec(s); 
WScript.Echo(m[2]);      // take second match

または正規表現なし。

var a = s.split('!');    // split in half
var b = a[1].split(' '); // split in half again, taking second half
WScript.Echo(b[0]);      // show first half
于 2012-10-24T16:30:15.330 に答える
0

何を意味するのかわかりませんが、単にこれを何度も繰り返すことを意味する場合は、次のようになります。

var substrings = [];
    string = SOME STRING HERE,
    index = string.indexOf('!'),
    nextWhiteIndex,
    stringToBePushed;

while (index !== -1) {

    stringToBePush = string.slice(index + 1);
    if (stringToBePush.indexOf(' ') !== -1) {
        nextWhiteIndex = stringToBePushed.indexOf(' ');
        substrings.push(stringToBePushed.substring(0, nextWhiteIndex + 1);
    } else if (stringToBePushed !== '') {
        substrings.push(stringToBePushed.substring(0);
    }

    index = string.indexOf('!');
}

編集:今、私はあなたが欲しいものを知っています。これにより、感嘆符の直後にすべての単語が表示されます。

于 2012-10-24T16:26:41.627 に答える
0

これを使用することもできます-

allText.slice(startIndex).trim().split(' ')[0]

これにより、startIndexの前にテキスト全体がスプライスされ、splitを使用して次のスペースが見つかり、最初のインデックスが取得されます。あなたはあなたの期待される言葉を得るでしょう。

于 2021-03-26T06:09:58.010 に答える