3

これはテキストエリアです。ユーザーは何でも書くことができます。

<textarea id="text">First sentence. Second sentence? Third sentence!
Fourth sentence.

Fifth sentence
</textarea>

最後に、すべてのテキストを配列に分割する必要があります。

var sentences = $('#text').val().split(/\r\n|\r|\n|[.|!|?]\s/gi);

私が抱えている問題は、区切り文字が配列項目の値に存在しないことです。これはが返すものです:

["First sentence", "Second sentence", "Third sentence", "Fourth sentence", "Fifth sentence"]

そのはず:

["First sentence.", "Second sentence?", "Third sentence!", "", "Fourth sentence.", "", "", "Fifth sentence"]

追加の考慮事項:

  • 最後の文は区切り文字を必要としません(任意の文字で終了できます)
  • 文に複数の区切り文字が含まれている場合は、それも配列項目に含める必要があります。例:2番目の文?? [...、 "2番目の文??"、...]

何か案は?どんなアプローチでも大歓迎です(必ずしもsplit()ではありません)-ありがとう

4

5 に答える 5

8

.match代わりに使用してください ( docs )/.../g-type 正規表現で使用すると、すべての一致の配列が返されます。最初に正規表現を変更する必要があります。

var sentences = $('#text').val().match(/[^\r\n.!?]+(\r\n|\r|\n|[.!?])\s*/gi);

<a href="http://jsfiddle.net/kEHhA/3/" rel="nofollow">http://jsfiddle.net/kEHhA/3/

于 2012-06-20T20:03:18.730 に答える
3
var re = /[^\r\n.!?]+(:?(:?\r\n|[\r\n]|[.!?])+|$)/gi;
("First sentence.. Second sentence?? Third sentence!!\n"+ "Fourth sentence").match(re).map($.trim)
//["First sentence..", "Second sentence??", "Third sentence!!", "Fourth sentence"]
于 2012-06-20T20:02:42.830 に答える
1

これはあなたの目的に合っていますか?すでに jQuery を使用しているようですが、そうでない場合は簡単に変更できます。

var sentences = [];
$.each($('#text').val().split(/([^\.\?\!\r\n]+.)\s/gi), function(i, sentence) {
  if(i%2 !== 0) {
    sentences.push(sentence)
  }
});
// sentences = ["First sentence.", "Second sentence?", "Third sentence!", "Fourth sentence."]

編集: Blazemonger のソリューションは似ていますが、より洗練されており、split() の代わりに match() を使用しているため、配列内の奇数要素を削除する 2 番目のステップは必要ありません。

于 2012-06-20T20:10:36.843 に答える
0

どうですか

var sentences = $('#text').val().split(/\r\n|\r|\n|\s/gi);
于 2012-06-20T19:54:54.353 に答える
0

後読みを使えば簡単ですが、JavaScript ではサポートされていないため、次のように提案します。

分割したい空白文字を見つけて、ダミー文字に置き換えます。次に、そのキャラクターで分割します。

何かのようなもの:

$('#text').val().replace(/\r\n|\r|\n|([.!?])\s/gi, '$1\0').split(/\0/g);​​​​​

編集:明らかに、分割に依存しないより良いソリューションがあります。ただし、これは代替手段として残します。

于 2012-06-20T20:02:34.103 に答える