1

バージョン管理の前処理ステップとして、エクスポートされたVBAコードに変数ケーシングを適用する正規表現を(AutohotkeyのRegExReplace関数を介して)作成しようとしています。したがって、大文字と小文字を区別しない「firstName」の出現箇所をすべてその大文字と小文字に一致するように変更する場合は、次の行を参照してください。

If FirstName = "" Then MsgBox "Please enter FirstName"

次のように翻訳されます:

If firstName = "" Then MsgBox "Please enter FirstName"
4

4 に答える 4

2

ツール/エディターが先読みをサポートしている場合は、次のことを試すことができます。

(?im)FirstName(?=([^"]*"[^"]*")*[^"]*$)

つまり:

(?im)        # enable case insensitive matching, multi-line option
F            # match the character 'F' or 'f'
i            # match the character 'i' or 'I'
r            # match the character 'r' or 'R'
s            # match the character 's' or 'S'
t            # match the character 't' or 'T'
N            # match the character 'N' or 'n'
a            # match the character 'a' or 'A'
m            # match the character 'm' or 'M'
e            # match the character 'e' or 'E'
(?=          # start positive look ahead
  (          #   start capture group 1
    [^"]*    #     match any character except '"' and repeat it zero or more times
    "        #     match the character '"'
    [^"]*    #     match any character except '"' and repeat it zero or more times
    "        #     match the character '"'
  )*         #   end capture group 1 and repeat it zero or more times
  [^"]*      #   match any character except '"' and repeat it zero or more times
  $          #   match the end of a line
)            # end positive look ahead

平易な英語:文字列'FirstName'(大文字と小文字を区別しない)に一致するのは、ゼロ、または行末までの前に偶数の二重引用符がある場合のみです。

行が引用符を含むコメントで終わっている場合は失敗することに注意してください!

于 2010-03-06T16:19:28.190 に答える
0

正規表現は、それ自体では機能せず文字列を受け入れます。のような正規表現

[fF][iI][rR][sS][tT][nN][aA][mM][Ee]

大文字と小文字の区別を問わず、文字列 'firstname' を受け入れます。次に、選択した言語で置換操作を記述して、認識された文字列を「firstName」に置き換えます。選択した正規表現の実装には、正規表現を簡素化する大文字と小文字を区別しないマッチング機能があることに気付くかもしれません。

問題は、式の正しい位置にない場合に FirstName の大文字と小文字を変更しないことです。つまり、例で FirstName の最初の出現を変更しますが、2 番目の出現は変更しません。デフォルトでは、正規表現が行で最初に一致したときにのみ置換を行うため、sed では簡単です。VBAでは、手がかりがありません。

あなたのルールは次のとおりです。

  • 最初に一致した場合のみ大文字と小文字を変換します。
  • 文字列の最初の = 記号の左側のみ大文字と小文字を変換します。
  • match が "" 内にない場合にのみ大文字と小文字を変換します。

?

3 番目の場合、"" をネストできる場合に問題が発生する可能性があります。一部の実装ではこの制限を回避する方法がありますが、正規表現は大括弧の任意の深さの入れ子 (大括弧に使用される文字が何であれ) に実際には対処できません。ただし、特定の数の一致する括弧内の文字列に一致する正規表現を作成しようとしていることに気付いた場合は、間違ったツールを使用していることを確信できます。

編集:3番目のケースでは、正規表現を次のように変更します

.*[^"].*[fF][iI][rR][sS][tT][nN][aA][mM][Ee]

これは、先頭に "

于 2010-03-06T16:15:29.830 に答える
0

FirstName引用文の最後に必ず表示され、その後に終わりがあることを常に期待している場合"は、否定的なルックアラウンドを使用して、そのような発生をあまり起こさないようにすることができます。FirstName(?!")

それ以外の場合、終了引用符のこの配置を保証できない場合、これに正規表現を使用することは理想的ではありません。

または、記号に注目して、=その前にあるものと一致させることもできます。この場合、肯定的な先読みが役に立ちます。FirstName(?=.*?=)

于 2010-03-06T16:18:15.273 に答える
0

正規表現は文脈依存ではないため、これを行うのは非常に困難です。

于 2010-03-06T15:52:46.470 に答える