2010-12-20 66 views
0

我試圖將pascal字符串文字輸入匹配到以下模式:@"^'([^']|(''))*'$",但這不起作用。模式有什麼問題?類似pascal的字符串文字正則表達式

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

什麼是Pascal類字符串? [This?](http://en.wikipedia.org/wiki/String_literal#Double-up_escape_sequence) – 2010-12-20 15:45:25

+1

您能顯示一些輸入字符串和預期結果嗎? – Toto 2010-12-20 15:56:15

回答

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 

如果您正在檢查的輸入包含除Pascal字符串之外的任何內容(例如,周圍的空白),則此正則表達式將失敗。

因此,如果您想使用正則表達式在較大的文本語料庫中查找Pascal字符串,則需要刪除^$錨點。

如果你想允許雙引號,太,那麼你需要增加的正則表達式:

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

在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

我使用空格分隔輸入,每個字符串將它匹配到一些詞位類。這就是我放錨的原因。所以據我所知,這是不適合帕斯卡帕斯卡樣''字符串''的序列。我對嗎? – lexeme 2010-12-20 16:26:59

+0

如果你用空白分割你的輸入,那麼它也會在字符串內部分裂,不是嗎?我將提供一些正則表達式將會和不會匹配的示例 - 您可能想要提供一些實際輸入的示例(編輯您的問題並粘貼一些示例)。 – 2010-12-20 16:31:00

+0

所以你是正確的字符串文字。如果我與空格分隔,那麼即使在工作模式下,我也無法以我的方式匹配它。那麼我該怎麼辦?感謝您的建議! – lexeme 2010-12-23 19:42:19