23

現在、長い列を短い列に分割するアプリケーションに取り組んでいます。そのために、テキスト全体を単語に分割しましたが、現時点では正規表現も数字を分割しています。

私がすることはこれです:

str = "This is a long string with some numbers [125.000,55 and 140.000] and an end. This is another sentence.";
sentences = str.replace(/\.+/g,'.|').replace(/\?/g,'?|').replace(/\!/g,'!|').split("|");

結果は次のとおりです。

Array [
    "This is a long string with some numbers [125.",
    "000,55 and 140.",
    "000] and an end.",
    " This is another sentence."
]

望ましい結果は次のようになります。

Array [
    "This is a long string with some numbers [125.000, 140.000] and an end.",
    "This is another sentence"
]

これを実現するには、どのように正規表現を変更する必要がありますか? 遭遇する可能性のある問題に注意する必要がありますか? ". "または、 、 、"? "およびを検索するだけで十分でしょ"! "うか?

4

8 に答える 8

36
str.replace(/([.?!])\s*(?=[A-Z])/g, "$1|").split("|")

出力:

[ 'This is a long string with some numbers [125.000,55 and 140.000] and an end.',
  'This is another sentence.' ]

壊す:

([.?!]).=または または?またはのいずれかをキャプチャ!

\s*= 前のトークンに続く 0 個以上の空白文字をキャプチャします([.?!])。これは、英語の文法に一致する句読点に続くスペースを考慮します。

(?=[A-Z])= 前のトークンは、次の文字が AZ (大文字の A から大文字の Z) の範囲内にある場合にのみ一致します。ほとんどの英語の文は大文字で始まります。以前の正規表現はどれもこれを考慮していません。


置換操作は以下を使用します。

"$1|"

1 つの「キャプチャ グループ」を使用し、それらの文字の 1 つをキャプチャして、 (一致する) plus に([.?!])置き換えます。したがって、キャプチャした場合、置換は になります。$1|??|

最後に、パイプを分割し|て結果を取得します。


したがって、基本的に、私たちが言っていることは次のとおりです。

1) 句読点 (.または?またはのいずれか!) を見つけてキャプチャする

2) 句読点の後には、必要に応じてスペースを含めることができます。

3) 句読点の後には、大文字が必要です。

提供された以前の正規表現とは異なり、これは英語の文法に適切に一致します。

そこから:

4) パイプを追加して、キャプチャされた句読点を置き換えます|

5) パイプを分割して、文の配列を作成します。

于 2013-09-20T10:46:21.647 に答える
7

次の文が大文字または数字で始まることを利用できます。

.*?(?:\.|!|\?)(?:(?= [A-Z0-9])|$)

正規表現の視覚化

Debuggex デモ

このテキストを分割します

This is a long string with some numbers [125.000,55 and 140.000] and an end. This is another sentence. Sencenes beginning with numbers work. 10 people like that.

文に:

This is a long string with some numbers [125.000,55 and 140.000] and an end.
This is another sentence.
Sencenes beginning with numbers work.
10 people like that.

jsfiddle

于 2013-09-20T10:54:54.463 に答える
5

スペース + 単語 char が後に続かない場合は、ドットを置換しないように先読みを使用します。

sentences = str.replace(/(?=\s*\w)\./g,'.|').replace(/\?/g,'?|').replace(/\!/g,'!|').split("|");

出力:

["This is a long string with some numbers [125.000,55 and 140.000] and an end. This is another sentence."]
于 2013-09-20T10:40:50.633 に答える
4

先読みを使用して、ドットの後に続くものが数字ではないことを確認する方が安全です。

var str ="This is a long string with some numbers [125.000,55 and 140.000] and an end. This is another sentence."

var sentences = str.replace(/\.(?!\d)/g,'.|');
console.log(sentences);

さらに安全にしたい場合は、後ろに数字があるかどうかを確認することもできますが、JS は後読みをサポートしていないため、前の文字をキャプチャして置換文字列で使用する必要があります。

var str ="This is another sentence.1 is a good number"

var sentences = str.replace(/\.(?!\d)|([^\d])\.(?=\d)/g,'$1.|');
console.log(sentences);

さらに簡単な解決策は、数値内のドットをエスケープし (たとえば、$$$$ に置き換える)、分割を行ってからドットをエスケープ解除することです。

于 2013-09-20T10:41:55.267 に答える
3

文字列を変更して、各文の間に何かを挿入するだけです。あなたはそれらを変更する権利があると私に言ったので、この方法で簡単に変更できます.

\r\n

これにより、検索する文字列が得られ、これらの複雑な正規表現を使用する必要がなくなります。

もっと難しい方法でやりたい場合は、正規表現を使用して「。」を探します。「?」「!」大文字が続きます。テッシが示したように

于 2013-09-20T11:01:43.873 に答える
3

'\s' を正規表現に入れるのを忘れました。

これを試してください

var str = "This is a long string with some numbers [125.000,55 and 140.000] and an end. This is another sentence.";
var sentences = str.replace(/\.\s+/g,'.|').replace(/\?\s/g,'?|').replace(/\!\s/g,'!|').split("|");
console.log(sentences[0]);
console.log(sentences[1]);

http://jsfiddle.net/hrRrW/

于 2013-09-20T10:55:31.053 に答える