5

単純なパターンを何度も繰り返したテキストを解析しています。テキストは、次のような芝居の台本形式です。

SAMPSON
I mean, an we be in choler, we'll draw.

GREGORY
Ay, while you live, draw your neck out o' the collar.

私は現在([A-Z0-9\s]+)\s*\:?\s*[\r\n](.+)[\r\n]{2}、文字のスピーチに改行が含まれている場合を除いて、正常に動作する pattern を使用しています (以下の説明)。その場合、キャラクターの名前は正常にキャプチャされますが、スピーチの最初の行だけがキャプチャされます。

単一行モードをオンにすると (改行を に含めるため.)、巨大な一致が 1 つだけ作成されます。

(.+)次のキャラクター名が見つかったときに停止して試合を終了するように指示するにはどうすればよいですか?
各一致を個別に (JavaScript) 反復処理しているため、名前は次の一致で使用できる必要があります。

理想的には、パターン全体が繰り返されるまで、すべての文字を一致させることができます。


パターンの説明:

最初のグループは、文字の名前 (大文字、数字、および空白を使用できます) と一致します (末尾のコロンと空白はオプションです)。
2 番目のグループ (キャラクターのスピーチ) は新しい行で始まり、任意の文字をキャプチャします (ただし、問題のある改行とその後の文字は除きます)。
パターンは、空白行の後で終了 (および最初から開始) します。

4

3 に答える 3

1

これで別の方向に進むことを検討してください。名前を含む任意の行で大きなダイアログを分割したい場合。正規表現を使用してこれを行うことができます (正規表現を「スピーカー」行に一致するものに置き換えます)。

results = "Insert script here".split(/^([A-Z]+)$/)

標準に準拠した実装では、サンプル テキストは次のような配列になります。

results[0] = ""
results[1] = "SAMPSON"      
results[2] = "I mean, an we be in choler, we'll draw.            
"
results[3] = "GREGORY"      
results[4] = "Ay, while you live, draw your neck out o' the collar. "

注意点として、ほとんどのブラウザーは、ここでの標準にむらがあるということです。ライブラリXRegExpを使用して、クロスプラットフォームの動作を取得できます。

于 2012-04-29T05:13:58.390 に答える
0

私はついにそれをあなたが望むものだけに一致させることができました、すなわち
-文字の名前、空白とコロンを可能にします
-そして、オプションで改行付きの複数行、人に関連付けられたテキスト

この正規表現を使用する必要がありますfindAll-大文字と小文字が区別されます:

((?:[A-Z]{2,}\s*:?\s*)+)\s+((?![A-Z]{2,}\s*:?\s*).+?[.?!]\s*)+

説明:

  • ((?:[A-Z]{2,}\s*:?\s*)+)-最初のグループは人の大文字の名前をキャプチャします-「GREGOR」および「MANFREDTHEGREATEST:」と一致します。
  • \s+-少なくとも1つの空白文字
    次に、少なくとも1回繰り返します。
  • (?![A-Z]{2,}\s*:?\s*)-次のテキストが大文字ではないことを確認してください
  • .+?[.?!]\s*[.?!]-文を終了する文字とオプションで空白が見つかるまで、すべてを一致させます
于 2012-04-29T16:43:03.320 に答える
0

さて、ちょっといじくり回して、うまくいくものを見つけました。それは超エレガントではありませんが、仕事はします。

([A-Z0-9\s]+)\s*\:?\s*[\r\n]((.+[\r\n]?.*)+)[\r\n]{2}

最後のキャプチャ グループを変更して、任意のテキスト、改行、さらに任意のテキストを無限に繰り返すことができるようにしました。2 回連続の改行は許可されていないため、パターンはスピーチの後で終了します。

于 2012-04-29T04:02:50.630 に答える