7

私は正規表現を持っています

(\p{P})\1 

のような重複した連続する句読点文字に正常に一致します

;;
,,
\\

、しかし、3 つのピリオド (省略記号) 句読点を除外する必要があります。

...
4

3 に答える 3

3

.##一部のアプローチでは、フォームの文字列(つまり、句読点を繰り返す前の「.」) にうまく一致しない場合があるため、注意してください。それが一致するはずのものであると仮定します。

このソリューションは、次の要件を満たしています。 -

  1. 句読点の繰り返しが一致します。
  2. 省略記号 (...) は一致しません。
  3. 2 つのドット (..) および 4 つ以上のドットが一致します。
  4. 句読点の繰り返しは、ドットが前後にある場合に一致します。.##

これは正規表現です:

(?>(\p{P})\1+)(?<!([^.]|^)\.{3})

説明:

  • ?>原子グループを意味します。具体的には、バックトラック位置をすべて破棄します。これは、'...' が一致しない場合でも、一歩下がって '..' の一致を試行しないことを意味します。
  • (\p{P})\1+)は 2 つ以上の句読点に一致することを意味します - あなたはすでにこれを持っていました。
  • (?<!([^.]|^)\.{3})は、繰り返される文字一致の末尾から逆方向に検索し、ドットまたは文字列の先頭が先行しない 3 つのドットが見つかった場合に失敗することを意味します。これは、2 つのドットまたは 4 つのドットまたはそれ以上のドットを機能させながら、3 つのドットを失敗させます。

次のテスト ケースはパスし、使用例を示しています。

string pattern = @"(?>(\p{P})\1+)(?<!([^.]|^)\.{3})";

//Your examples:
Assert.IsTrue( Regex.IsMatch( @";;", pattern ) );
Assert.IsTrue( Regex.IsMatch( @",,", pattern ) );
Assert.IsTrue( Regex.IsMatch( @"\\", pattern ) );
//two and four dots should match
Assert.IsTrue( Regex.IsMatch( @"..", pattern ) );
Assert.IsTrue( Regex.IsMatch( @"....", pattern ) );

//Some success variations
Assert.IsTrue( Regex.IsMatch( @".;;", pattern ) );
Assert.IsTrue( Regex.IsMatch( @";;.", pattern ) );
Assert.IsTrue( Regex.IsMatch( @";;///", pattern ) );            
Assert.IsTrue( Regex.IsMatch( @";;;...//", pattern ) ); //If you use Regex.Matches the matches contains ;;; and // but not ...
Assert.IsTrue( Regex.IsMatch( @"...;;;//", pattern ) ); //If you use Regex.Matches the matches contains ;;; and // but not ...            

//Three dots should not match
Assert.IsFalse( Regex.IsMatch( @"...", pattern ) );
Assert.IsFalse( Regex.IsMatch( @"a...", pattern ) );
Assert.IsFalse( Regex.IsMatch( @";...;", pattern ) );                        

//Other tests
Assert.IsFalse( Regex.IsMatch( @".", pattern ) );
Assert.IsFalse( Regex.IsMatch( @";,;,;,;,", pattern ) );  //single punctuation does not match                        
Assert.IsTrue( Regex.IsMatch( @".;;.", pattern ) );
Assert.IsTrue( Regex.IsMatch( @"......", pattern ) );                                       
Assert.IsTrue( Regex.IsMatch( @"a....a", pattern ) );
Assert.IsFalse( Regex.IsMatch( @"abcde", pattern ) );     
于 2013-09-19T08:50:42.217 に答える
2

マッチングを避けるために...

(?<![.])(?![.]{3})(\p{P})\1
于 2013-09-16T06:27:52.853 に答える