ホームページ >バックエンド開発 >C++ >セミコロンで終わる C の For および While ループを確実に検出するために正規表現を改善するにはどうすればよいでしょうか?

セミコロンで終わる C の For および While ループを確実に検出するために正規表現を改善するにはどうすればよいでしょうか?

Barbara Streisand
Barbara Streisandオリジナル
2024-12-15 03:41:13477ブラウズ

How Can We Improve Regular Expressions to Reliably Detect C   For and While Loops Ending with Semicolons?

セミコロンを使用した C ループ検出の正規表現の改善

はじめに

元の質問では、次で終了する C の for または while ループを識別するための正規表現を求めていました。セミコロン。提案されたソリューションでは、名前付きキャプチャ グループを利用していましたが、関数呼び出しがループの 3 番目の式に含まれているときに問題が発生しました。

拡張正規表現

この問題を解決するために、別のアプローチが開発されました。

# match any line that begins with a "for" or "while" statement:
REGEX_STR = r"^\s*(for|while)\s*\("

# match a balanced substring, accounting for function calls within expressions:
SUB_STR_PATTERN = r"([^\(\)]|(\([^\(\)]*(?:\|\|[^()\s]*(?1))*?\)))"

# match a balanced string of arbitrary length, including function calls:
SUB_STR_GROUP = f"(?P<balanced>{SUB_STR_PATTERN})+"

# match the initial opening parenthesis, followed by balanced expressions, and finally the closing parenthesis.
REGEX_STR += f"{SUB_STR_GROUP}\)\s*;\s*"

# compile the regex object with MULTILINE and VERBOSE flags for readability
REGEX_OBJ = re.compile(REGEX_STR, re.MULTILINE | re.VERBOSE)

説明

この強化された正規表現は、SUB_STR_PATTERN を利用してバランスのとれたパターンを定義します。関数呼び出しを含めることができる部分文字列。 ||演算子は、論理 OR 条件を作成するために使用され、括弧で囲まれていない文字またはネストされたバランスのとれた文字列のいずれかにパターンを一致させることができます。

SUB_STR_GROUP 内でこのパターンを繰り返すことにより、正規表現はバランスの取れた文字列と一致することを保証します。

結論

この改良された正規表現は、より堅牢なソリューションを提供します。ループの 3 番目の式内に関数呼び出しが存在する場合でも、セミコロンで終了する C の for または while ループを検出します。再帰パターンの必要性を排除することでロジックを簡素化します。

以上がセミコロンで終わる C の For および While ループを確実に検出するために正規表現を改善するにはどうすればよいでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。