2017-12-18 9 views
2

正規表現を使用して文字列内のコメント行を探したいと思います。私は以下を試みたが、それは最初の後にすべてを与える//行末までの正規表現

なぜですか?

program Project1; 

uses 
    RegularExpressions; 

var 
    Text: string; 
    Pattern: string; 
    RegEx: TRegEx; 
    Match: TMatch; 
begin 
    Text := 'Hello' + #13#10 
    + '// Test' + #13#10 
    + 'Text' + #13#10; 

    Pattern := '//[^$]*$'; 

    RegEx := TRegEx.Create(Pattern, [roCompiled, roMultiLine]); 
    Match := RegEx.Match(Text); 
    if (Match.Success) then 
    begin 
    Match.Index; // 8 -> Expected 
    Match.Length; // 15 -> I would like to have 9 
    end; 
end. 
+0

あなたのパターンの始めに改行で '(?m)'とマッチさせることができます。 –

+1

私たちの回答はあなたの問題を解決しましたか? – Allan

+0

私たちが助けることができるものがあると思ったら、私たちの答えの下のコメントを介してお知らせください。 –

答えて

1

あなたは正規表現で次の構文を使用しないでください。[^$]*

これは全体を取るために、あなたの正規表現を引き起こすもの(EOL文字を含む)のN倍にドル$ 0でないすべての文字を取って意味します文字列。代わりに、regexで

用途:

Pattern := '//[^\r\n]*' 

幸運!

1

は、あなたが行の末尾を指定する必要はありませんよう、.*は実質的に任意の行をmatcing、改行以外の0+文字に一致します。あなたもroMultiLineオプションを削除することが

Pattern := '//.*'; 

を使用する必要があります現在の位置からの終わり(ここでは、//の後)。