1

最適化?

次の正規表現に問題があります。

/^\s*(/?\*{1,2}(\s*(\b.*\b)\s*(\*/)?)?|\*/?\s*)$/g

この表現を改善できるかどうか疑問に思っています。また、この表現に問題があると思われる方がいらっしゃいましたら、ご指摘いただけますでしょうか。これが私のライブデモです。以下で設定したすべての条件で機能します

テスト制約

これらの一致

/**
/*
*
*/
/** Javadoc */
/* Block */
* Multi-line 
/* Single Line */
/** A
/** A */
/* A
/* A */

これらはすべきではありません

7 * 8
// Regular comment

結果

一致を次のものに置き換えた後:// $3

一部の末尾に空白があるにもかかわらず、それらを正常に変換しました。

// 
// 
// 
// Javadoc
// Block
// Multi-line
// Single Line
// A
// A
// A
// A

正規表現の説明

/
^            Line start
\s*          0 or more white-space
(            Start group 1
   /?        forward-slash (OPTIONAL)
   \*{1,2}   1 to 2 asterisks
   (         Start group 2
      \s*    0 or more white-space
      (      Start group 3
         \b  Start word boundry
         .*  0 or more of anything
         \b  End word boundry
      )      End group 3
      \s*    0 or more white-space
      (      Start group 4 (OPTIONAL)
         \*  0 or more asterisks
         /   Forward-slash
      )?     End group 4
   )?        End group 2 (OPTIONAL)
     |       OR
   \*        Asterisk
   /?        Forward-slash (OPTIONAL)
   \s*       0 or more white-space
)            End group 1
$            Line end
/            
g            Global; match all
4

1 に答える 1

0

文字列の埋め込み、エスケープ、および行の継続を考慮する必要がある場合、C/C++ スタイルのコメントの解析はもう少し複雑になります。

これには、単一の文字消費パススルー メソッドも必要です (他のすべてがチェックされた後)。そういうわけで、多くの可能性のある一致の代替の中で、あなたが興味を持っている項目は 1 つだけです - C スタイルのコメント/* */です。

したがって、グローバル検索と多くの一致の場合、関心のあるのは 1 つだけです。たとえば、キャプチャ グループ 1 の一致です。もちろん、あなたの場合、単純な置換ではうまくいきません。

そのため、グローバルな検索 (置換ではない) ループに入る必要があります。各一致はソース文字列の一部になり、スキップされる部分はないため、それぞれが宛先文字列に追加されます。

ループ中に、キャプチャ グループ 1 が一致する場合 (C スタイルのコメント)、それほど単純ではない置換を行って C++ コメントにし、その結果を宛先文字列に追加できます。

それはそれの要点です。どの言語を使っていてもこれができないのであれば、正しく行うことはできません。それは間違いありません!

//以下は、C スタイルのコメントをキャプチャしたとき に変換を実行する正規表現のリストです。これらは、出現順に実行する必要があります (表記は例としてのみ Perl です)。

 # s{ ^  /\*     (?: [^\S\n] | \*)*       }{// }xmg;
 # s{ ^          (?: [^\S\n] | \*)* \*/ $ }{// }xmg;
 # s{ ^                                 $ }{// }xmg;
 # s{ ^          (?: [^\S\n] | \*)+       }{// }xmg;
 # s{ (?<![\s*]) (?: [^\S\n] | \*)+     $ }{}xmg;
 # s{ (?<![\s*]) (?: [^\S\n] | \*)* \*/ $ }{}xmg;

これは、検索ループで使用する正規表現です (上記で説明したとおり)。この正規表現は、FAQ の一部である Perl ニュース グループで見つけることができます。

    # (?:(/\*[^*]*\*+(?:[^/*][^*]*\*+)*/)|//(?:[^\\]|\\\n?)*?\n)|(?:"(?:\\[\S\s]|[^"\\])*"|'(?:\\[\S\s]|[^'\\])*'|[\S\s][^/"'\\]*)
    # -----------------------------------------------------------------


    (?:                             # Comments 

         (                               # (1 start)
              /\*                             # Start /* .. */ comment
              [^*]* \*+
              (?: [^/*] [^*]* \*+ )*
              /                               # End /* .. */ comment
         )                               # (1 end)
      |  
         //                              # Start // comment
         (?: [^\\] | \\ \n? )*?          # Possible line-continuation
         \n                              # End // comment
    )
 |  
    (?:                             # Non - comments 
         "
         (?: \\ [\S\s] | [^"\\] )*       # Double quoted text
         "
      |  '
         (?: \\ [\S\s] | [^'\\] )*       # Single quoted text
         ' 
      |  [\S\s]                          # Any other char
         [^/"'\\]*                       # Chars which doesn't start a comment, string, escape,
                                         # or line continuation (escape + newline)
    )
于 2013-10-11T08:55:23.203 に答える