2012-04-29 15 views
5

単純なパターンの繰り返しが多いテキストを解析しています。テキストはこのように、遊びのためのスクリプトの形式である:私は現在、キャラクターの音声がその中に改行がある場合を除いて正常に動作パターン([A-Z0-9\s]+)\s*\:?\s*[\r\n](.+)[\r\n]{2}、(以下の説明を)使用してい次の一致までのすべての文字を一致させる正規表現

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

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

。それが起こると、キャラクターの名前は首尾よくキャプチャされますが、スピーチの最初の行だけがキャプチャされます。

シングルラインモードをオンにすると(.に改行を含める)、1つの巨大なマッチが作成されます。

(.+)は、次の文字の名前を見つけてマッチを終了するとどのように停止するのですか?
私は各マッチを個別に反復しています(JavaScript)ので、その名前は次のマッチで利用できるようにする必要があります。

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


パターンは次のように説明し

最初のグループは(末尾のコロンと空白のオプション付き)(大文字、数字、および空白を許可する)キャラクターの名前と一致します。
2番目のグループ(キャラクタの発言)は、改行で始まり、任意の文字(問題のある行末や改行を除く)をキャプチャします。
パターンは、空白行の後で終了します。

+0

それにマッチする正規表現。それは単独の行にコロンが続く単一の単語ですか?それは不正確な一致をもたらすでしょうか? – mellamokb

+0

@mellamokbパターンの最後の部分を含めるのを忘れました。パターンの最後の部分は空白行を探します。マッチはキャラクターの名前から始まり(すべての大文字と小文字が区別されます)、発言後の空白行で終わります。 – Nathan

+0

サンプルテキストにコロンがないと思うので、正規表現はそれで動作しません。 –

答えて

0

わかりました。ちょっとしたことをして、うまくいくものを見つけました。スーパーエレガントではありませんが、それは仕事をします。

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

私は、任意のテキストを、新しいライン、そしてより多くの任意のテキストの無限の繰り返しを可能にするために、最後のキャプチャグループを変更しました。連続した2つの改行は許可されていないため、パターンは音声の後で終了します。

+0

私はちょうど指摘したいと思った、あなたの質問からの正規表現と例を[正規表現テストツール](http://gskinner.com/RegExr/)に貼り付け、単純に* dotall *モードを有効にしたあなたの問題。あなたにとってはうまくいかなかったのは奇妙です。 – Hubro

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を使用すると、クロスプラットフォームの動作を取得できます。

+0

私の使用例では、ダイアログを別々の行に分割することは意味がありません。プログラム(およびユーザー)はダイアログ全体とやり取りするので、便利なようにそれらを一緒にステッチする必要があります。 – Nathan

0

最終的には、あなたが望むもの、つまり
- キャラクターの名前、空白を可能とコロン
- 、人

に関連したテキストはあなたがこの正規表現を使用してfindAllを行うことや、必要に応じて改行して複数行を必要とする - それは大文字と小文字が区別されます:

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

説明:

  • ((?:[A-Z]{2,}\s*:?\s*)+) - 最初のグループは、人の大文字の名前をキャプチャ - それは少なくとも一回繰り返して次に少なくとも一つの空白文字
    -
  • \s+
  • (?![A-Z]{2,}\s*:?\s*)を - 次のテキストが上ではないことを確認するために先読み:「GREGOR」だけでなく、「マンフレッドがGREATEST」にマッチしますケースキャラクター名
  • .+?[.?!]\s* - あなたは文を終了文字を見つけるまで、すべてを一致[.?!]し、必要に応じて空白
  • あなたは令状する前に、次の名前が始まる場所明確に1がどのように決定するかを定義する必要が
関連する問題