2010-12-20 14 views
0

私はパスカル文字列のリテラル入力を次のパターンに一致させようとしています:@"^'([^']|(''))*'$"しかし、それは動作しません。パターンの何が間違っていますか?パスカルのような文字列リテラル正規表現

public void Run() 
{    
    using(StreamReader reader = new StreamReader(String.Empty)) 
    { 
     var LineNumber = 0; 
     var LineContent = String.Empty; 

     while(null != (LineContent = reader.ReadLine())) 
     { 
      LineNumber++; 

      String[] InputWords = new Regex(@"\(\*(?:\w|\d)*\*\)").Replace(LineContent.TrimStart(' '), @" ").Split(' '); 

      foreach(String word in InputWords) 
      { 
       Scanner.Scan(word); 
      } 

     } 
    } 
} 

私は、任意のパスカル・エントリのコメント入力文字列を検索する空白に置き換える、その後、私は次のようにそれらを一致させるためにサブストリングに入力を分割:

private void Initialize() 
{ 
    MatchingTable = new Dictionary<TokenUnit.TokenType, Regex>(); 

    MatchingTable[TokenUnit.TokenType.Identifier] = new Regex 
    (
     @"^[_a-zA-Z]\w*$", 
     RegexOptions.Compiled | RegexOptions.Singleline 
    ); 
    MatchingTable[TokenUnit.TokenType.NumberLiteral] = new Regex 
    (
     @"(?:^\d+$)|(?:^\d+\.\d*$)|(?:^\d*\.\d+$)", 
     RegexOptions.Compiled | RegexOptions.Singleline 
    ); 
} 
// ... Here it all comes together 
public TokenUnit Scan(String input) 
{       
    foreach(KeyValuePair<TokenUnit.TokenType, Regex> node in this.MatchingTable) 
    { 
     if(node.Value.IsMatch(input)) 
     { 
      return new TokenUnit 
      { 
       Type = node.Key       
      }; 
     } 
    } 
    return new TokenUnit 
    { 
     Type = TokenUnit.TokenType.Unsupported 
    }; 
} 
+3

パスカルのような文字列リテラルとは何ですか? [これ?](http://en.wikipedia.org/wiki/String_literal#Double-up_escape_sequence) –

+1

入力文字列と期待される結果を表示できますか? – Toto

答えて

1

パターンが正しいように見えます、それを簡略化することができるが:

^'(?:[^']+|'')*'$ 

説明:

^  # Match start of string 
'  # Match the opening quote 
(?: # Match either... 
[^']+ # one or more characters except the quote character 
|  # or 
'' # two quote characters (= escaped quote) 
)*  # any number of times 
'  # Then match the closing quote 
$  # Match end of string 

この正規表現には、パスカル文字列(例えば、空白を含む)以外のものが含まれていると、この正規表現は失敗します。

大文字のコーパス内で正規表現を使用してパスカル文字列を検索する場合は、^$のアンカーを削除する必要があります。

そして、あなたはあまりにも、二重引用符を許可する場合は、その後、あなたは正規表現を強化する必要があります。

^(?:'(?:[^']+|'')*'|"(?:[^"]+|"")*")$ 

C#の場合:

foundMatch = Regex.IsMatch(subjectString, "^(?:'(?:[^']+|'')*'|\"(?:[^\"]+|\"\")*\")$"); 

この正規表現は

'This matches.' 
'This too, even though it ''contains quotes''.' 
"Mixed quotes aren't a problem." 
'' 
のような文字列に一致します。

文字列と一致しません

'The quotes aren't balanced or escaped.' 
There is something 'before or after' the quotes. 
    "Even whitespace is a problem." 
+0

私は空白分割入力を1文字列ごとに使用して、それをいくつかの語彙クラスと照合します。だから私はアンカーを置くのです。だから私が理解する限り、それはパスカルの「パスカルのような」文字列では適切なシーケンスではない。私は正しい? – lexeme

+0

あなたの入力を空白で分割すると、文字列の中で分割されますね。私は、この正規表現が一致するかどうかのいくつかの例を提供します - あなたの実際の入力のいくつかのサンプルを提供する(あなたの質問を編集し、いくつかのサンプルを貼り付ける)かもしれません。 –

+0

あなたは文字列リテラルについて正しいです。私が空白で行を分割すると、作業パターンであってもそれを私の方法で一致させることはできません。だから私は何をするつもりですか?アドバイスありがとう! – lexeme