regex can be very difficult for a human to read and to comprehend. That is why,
like any good code, a good regular expression must be well formatted and documented.
Here are some guidelines when formatting and documenting your regex:
1. Keep each line under 80 characters, horizontal scrolling reduces readability.
2. Break long patterns into multiple lines, usually after a space or a line break.
3. Indent bracers to help think in the right scope.
4. Format complicated OR patterns into multiple blocks like a case statement.
5. Comment your regex on what it does, don't just translate it into English.
# Match <BODY
<BODY
# Match any non > char for zero to infinite number of times
[^>]*
# MATCH >
>
Bad example: Comment that translates the regex into English.
<BODY
# Match any non > char for zero to infinite number of times
[^>]*
# MATCH >
>
# Match the BODY tag
<BODY
# Match any character in the body tag
[^>]*
# Match the end BODY tag
>
<BODY
# Match any character in the body tag
[^>]*
# Match the end BODY tag
>
Good example: Comment that explains the purpose of the pattern.
(?six-mn:(LabelTextBox)\s+(?<Name>\w+).*(?<Result>\k<Name>\.TextAlign\s*=\s*
((System\.)?Drawing\.)?ContentAlignment\.(?! TopLeftMiddleLeftTopCenterMiddleCenter)\w*)(?!(?<=\k<Name>\.Image.*)(?
=.*\k<Name>\.Image)))
((System\.)?Drawing\.)?ContentAlignment\.(?! TopLeftMiddleLeftTopCenterMiddleCenter)\w*)(?!(?<=\k<Name>\.Image.*)(?
=.*\k<Name>\.Image)))
Bad Example: Pray you never have to modify this regex.
(?six-mn:
# Match for Label or TextBox control
# Store name into <name> group
(LabelTextBox)\s+(?<Name>\w+).*
# Match any non-standard TextAlign
# Store any match in Result group for error reporting in CA
(?<Result>
# Match for control's TextAlign Property
\k<Name>\.TextAlign\s*=\s*
# Match for possible namespace
((System\.)?Drawing\.)?ContentAlignment\.
# Match any ContentAlignment that is not in the group
(?!TopLeftMiddleLeftTopCenterMiddleCenter)\w*
)
# Skip any Control that has image on it
(?!
(?<=
\k<Name>\.Image
.*
)
(?=
.*
\k<Name>\.Image
)
)
)
Good Example: Now it make sense!
# Match for Label or TextBox control
# Store name into <name> group
(LabelTextBox)\s+(?<Name>\w+).*
# Match any non-standard TextAlign
# Store any match in Result group for error reporting in CA
(?<Result>
# Match for control's TextAlign Property
\k<Name>\.TextAlign\s*=\s*
# Match for possible namespace
((System\.)?Drawing\.)?ContentAlignment\.
# Match any ContentAlignment that is not in the group
(?!TopLeftMiddleLeftTopCenterMiddleCenter)\w*
)
# Skip any Control that has image on it
(?!
(?<=
\k<Name>\.Image
.*
)
(?=
.*
\k<Name>\.Image
)
)
)