1

ファイルから読み取った変数に対して使用すると、以下のコードの RegExMatch コマンドが失敗する理由を見つけようとしています。ファイルの内容を AHK 内の変数に直接割り当てると機能します。

これをテストするには、メモ帳を開き、TableCode2 の複数行の内容をメモ帳にコピーして、c:\temp\testtable.txt として保存します。

スクリプトを実行すると、最初のメッセージ ボックスに一致が表示されません。2 番目のボックスが一致します。これをwindows7 32ビットと64ビットの両方でテストしました。

両方のシナリオの違いと、ファイルと照合できない理由について何か考えはありますか?

InputTable = c:\temp\testtable.txt
FileRead, TableCode, %InputTable%

TableCode2 =
(
OBJECT Table 50093 test
{
  OBJECT-PROPERTIES
  {
    Date=22.08.13;
    Time=10:47:20;
  }
  PROPERTIES
  {
  }
  FIELDS
  {
    { 1   ;   ;test                ;Text30         }
  }
  KEYS
  {
    {    ;test                                    ;Clustered=Yes }
  }
  CODE
  {

    BEGIN
    END.
  }
}
)

Needle := "FIELDS(.*)KEYS"
Foundpos := RegExMatch(TableCode,Needle,Out)
msgbox, %Needle%`n %Out1%`n--------------%TableCode%

Foundpos := RegExMatch(TableCode2,Needle,Out)
msgbox, %Needle%`n %Out1%`n--------------%TableCode%
4

1 に答える 1

2

AHK 正規表現のドットは、「改行 (`r`n) シーケンスの一部ではない任意の 1 文字」に一致します。ここがトリッキーな部分です。Windows テキスト ファイルの改行はデフォルトで`r`nですが、コード内のブラケット表記は改行として`n文字で構成されています。
その結果、`r`nRegExMatch("FIELDS(.*)KEYS")に遭遇すると、デフォルトで消費を停止します。ファイルに関するあなたの例では、これは の直後にあり、正規表現が真になることを許可していません。 一方、変数には`r`n文字が 1 つも含まれていないため、正規表現は.FIELDS
TableCode2KEYS
ファイルから各`rを削除 するなど、多くの可能な解決策がありますが、おそらく最も簡単で最も一貫した方法は、単純なDotAllオプションを使用することです。「これにより、ピリオド (.) が改行を含むすべての文字に一致します (通常、改行には一致しません)。
結果の正規表現は次のようになりますs)FIELDS(.*)KEYS

ただし、正規表現を使用して正規言語ではないものを解析することはすべきではありません。出力を制御できる場合は、XML や JSON などの標準化された形式を使用してください。ある種のプログラミング言語を解析する場合は、既存のコンパイラ/インタープリターを使用して解析し、変換します。

于 2013-08-22T12:34:54.550 に答える