2011-05-15 102 views
1

我試圖得到單個支架後跟非空格,但不是雙括號和非空格的匹配。我有@"\[[\S^\[]"但它不是很工作。爲了澄清一點,我正在研究一個wiki解析器(所以它是基於字符串的 - 我以爲只是正則表達式的工作原理)。我的鏈接以[開頭,但我想逃避[雙[[。維基已經有效,但我正在創建一個修改後的版本,希望能夠更容易地擴展。正則表達式[ S但不是[[ S?

這裏的處理程序調用代碼:

foreach (Rule rule in rules) 
{ 
    if (position + rule.Length > text.Length) 
     break; 
    if ((rule.PreCondition & condition) == rule.PreCondition) 
    { 
     if (substring.Length < rule.Length) 
      substring = text.Substring(position, rule.Length); 
     if (rule.Pattern.IsMatch(substring)) 
     { 
      string previous = text.Substring(0, position); 
      sb.Append(previous); 
      text = text.Remove(0, position); 
      position = 0; 
      text = rule.Handler(new HandlerParameter(text, condition, previous)); 
     } 
    } 
} 

所以BracketHandler使用該模式以確定是否我們在一個支架。我的原始模式是\[\S,但對於[[如果它正在檢查[s和最後一個字符是a [[s]不起作用。只需要提一下我的令人費解的代碼,但至少可以看到它。

回答

4

可以使用負回顧後:

@"(?<!\[)\[[^[\s]" 

(哇,看起來險惡,呃...?)

編輯:

@"(^|[^[])\[[^[\s]" 
:它不需要回顧後的潛在替代品
+0

看起來像Perl,所以是的,是的,它:) :) – 2011-05-15 23:07:22

+0

謝謝你這個作品的一些案件,但不是一切。我最終預先解析了雙括號。一個問題,後視會更慢,這就是爲什麼另一個? – 2011-05-16 20:00:04

0

我認爲問題在於^必須在組的開始處指示否定。爲什麼不顯示的空間陰性對照組和「[」是這樣的:

@"\[[^\s\[]" 
+0

這可以工作,但只能從字符串的開頭 - 所以它取決於OP是否搜索字符串。 – bluepnume 2011-05-15 18:13:54

+0

\ s是任何空間,\ S我們任何非空間。這仍然不起作用,因爲它符合[[s。 – 2011-05-15 22:16:04

0

我在這裏失去了一些東西,或者[^[]\[[^\s[]不會有任何問題的工作?

+0

這與juharr的解決方案有相反的問題:如果[s出現在字符串的開頭,它將不匹配。 – bluepnume 2011-05-15 23:41:56

相關問題