0

いくつかの単純な文法概念に基づいて、正規表現に置き換え/一致させようとしています。遅くなりましたが、一晩で学習できるといういつもの自信を持って、正規表現の Web サイトにアクセスしました。これを半年に1回くらいやっています。はい、私はばかです。

とにかく、この時間に(または実際には池の向こう側に)テイカーがいる場合に備えて、誰かがいくつかの簡単な文法規則を支持する正規表現を教えてください。

  • カンマ (,) ピリオド (.) および単一引用符 (') の前に 1 つ以上のスペースを挿入することはありません。
  • コンマ (,) ピリオド (.) の後には常に 1 つのスペースが続きます (それ以上でも以下でもありません)。
  • コンマ (,) ピリオド (.) とスペース ( ) は、2 回以上繰り返されることはありません。
  • ペアの最初の二重引用符 (") の後に 1 つ以上のスペースが続くことはなく、最後の二重引用符の後には常に1 つのスペースまたはピリオド (.) 文字が続きます。
  • 最後の二重引用符の前にスペース ( ) を含めないでください。

これは、正規表現の理解を深めるのに役立つと確信しているため、いくつかの一般的な説明は間違いなく賛成票を投じるでしょう。

気分を害して申し訳ありませんが、これを実装するために Actionscript 3 を使用しています。どの正規表現エンジンを利用しているかはわかりませんが、いくつかの癖があることは間違いありません。ただし、慣れ親しんだ正規表現の実装では試してみる価値があります。

ビジュアルは次のとおりです。

// string before

var string:String = '" Hello ,my name is Shennan ,, "he said  .  ';

string = string.replace(/* your regex magic */, /* replace with */);

trace(string); /* output: "Hello, my name is Shennan," he said. */
4

2 に答える 2

3

これは、コンマとピリオドの前後のスペースを処理します。

var pattern:RegExp = / *([,.]) */g;
string.replace(pattern, "$1 ");

これは、一重引用符の前のスペースを処理します。

var pattern:RegExp = / *'/g;
string.replace(pattern, "'");

これは、繰り返されるコンマ、ピリオド、および単一引用符を処理します。

var pattern:RegExp = /([,.'])\1*/g;
string.replace(pattern, "$1");

たとえば、段落に分割された引用された資料 (スピーチなど)は、前の段落の引用を閉じずに引用を再開することがよくあるため、一対の引用を処理する簡単な方法はありません。引用符が均等にペアになることが保証されている場合にのみ、次を使用できます。

var pattern:RegExp = /" *([^"]*)"/g;
string.replace(pattern, '"$1"');

 

var pattern:RegExp = /("[^"]*")(?![. ])/g;
string.replace(pattern, '$1 ');

Actionscript 3 は後方参照と否定先読みをサポートしているため、上記のすべてが機能するはずですが、確かに私はそれらをテストしていません (実行する必要があるため、まだ)。

于 2013-07-15T23:23:05.217 に答える
3

あなたのルールに基づいて、プロセスを一連の正規表現置換に分割しました。これらをテストしていませんが、acheong87の回答と比較すると、私には正しいように見えます:

--

ルール 1: コンマ (,) ピリオド (.) および単一引用符 (') の前に 1 つ以上のスペースを入れないでください。

簡単です。1 つ以上のスペース ( \s+) に一致させ、その後にコンマ、ピリオド、または単一引用符 ( [,.']) を付けるだけです。コンマ、ピリオド、または一重引用符を括弧 ( ()) でキャプチャして、次のように置換で使用できるようにします$1

var pattern:RegExp = /\s+([.,'])/g;
string.replace(pattern, '$1');

--

ルール 2: コンマ (,) ピリオド (.) の後には常に 1 つのスペースが続きます (それ以上でもそれ以下でもありません)。

これを 2 つの正規表現に分割してみましょう。最初に、コンマまたはピリオド ( [,.]) とそれに続く 1 つ以上のスペース ( \s+) を照合し、それらのスペースを 1 つのスペースに置き換えます。

var pattern:RegExp = /([.,])\s+)/g;
string.replace(pattern, '$1 ');

次に、カンマまたはピリオドの後にスペース ( \S) 以外が続くものに一致させます (ここでは否定先読みでこれを行いますが、他の方法もあります)。カンマまたはピリオドの後に単一のスペースが続くものに置き換えます。

var pattern:RegExp = /([.,])(?!\s)/g;
string.replace(pattern, '$1 ');

--

ルール 3: カンマ (,) ピリオド (.) とスペース ( ) は 2 回以上繰り返されません。

簡単です:

var pattern:RegExp = /([,.\s])+/g;
string.replace(pattern, '$1');

--

ルール 4 + 5: ペアの最初の二重引用符 (") の後に 1 つ以上のスペースが続くことはなく、最後の二重引用符の後には常に 1 つのスペースまたはピリオド (.) 文字が続きます。最後の二重引用符にはスペースを含めないでください。 ( ) その前に。

acheong87 が言うように、これは少しトリッキーです。一対の引用符しかないと仮定すると、次のルールを使用できます。

var pattern:RegExp = /"\s*([^"]*)"/g;
string.replace(pattern, '"$1"');

var pattern2:RegExp = /"([^"]*)\s*"(?![.\s])/g;
string.replace(pattern2, '"$1".');

これは、スペースまたはピリオドが続かない終了引用符の後にピリオドを追加することを前提としています。'"$1" 'その場合に代わりにスペースを使用する場合は、最後の引数を に変更できます。


必要に応じて、これらのルールを大幅に簡素化できます。たとえば、ルール 3の正規表現を最初に適用すると、他のルールで繰り返されるスペースを考慮する必要がなくなります。これは、ルール 2の最初の正規表現は必要なく、2 番目のものだけを使用できることを意味します。

また、いくつかの良い例については、acheong87 の素晴らしい回答を参照してください。

于 2013-07-15T23:40:22.140 に答える