2011-05-15 83 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

相关问题