2017-10-05 72 views
0

我在看别人的正则表达式......我可以弄清楚我正在处理积极的lookbehind,但我不确定它应该匹配什么:(?<=[^])\t{2,}|(?<=[>])C#regex中的[^]匹配是什么?

我知道当中小号ü˚F[stuff]匹配任何字符。我知道[^stuff]匹配任何字符不是其中。

[^]是什么意思?我想这可能意味着“任何不是长度为零的东西”,即“任何东西”。但是为什么不只是在简单的.表达式上使用一些扩展(以捕获换行符)呢?

更新:

每Wikter的评论,[^]单独无效。但是,这仍然让我想知道这件事情是应该做的......

对我来说,直观的阅读是...

(?<=[^]) - 向后看,无论什么[^]比赛

\t{2,} - 然后找到两个或两个以上选项卡

| - 如果不是对于比赛......

(?<=[>]) - ...看看后面的>字符。

我的翻译在哪里缺少标记?

+0

与ECMAScript以外的大部分正则表达式类似,这是一种无效模式。它会抛出*'Unterminated [] set' *异常。要匹配任何字符,可以使用'(?s:。)'(''.'模式和'RegexOptions.Singleline'选项)。 –

+0

@WiktorStribiżew谢谢,你是对的,我给的表达不会编译。我从源regex添加了更多的上下文:'(?<= [^])\ t {2,} |(?<=[>])''。 – mac9416

+1

是的,所以“C#regex中的[^]匹配是什么?”它不匹配任何东西,因为它是无效的模式。它甚至没有尝试,它在解析阶段失败。而'[^>]'是一个否定的字符类,匹配任何字符,但匹配'>'。 –

回答

3

[^]不匹配任何内容,因为它是无效模式。它甚至没有尝试,它在解析阶段失败。另一方面,[^>]是一个否定字符类,它匹配任何字符但是>

[^]在除ECMAScript以外的大部分正则表达式中都是无效模式。它会在.NET中抛出Unterminated [] set异常。

要匹配任何字符,请使用(?s:.).模式和RegexOptions.Singleline选项)。

(?<=[^])\t{2,}|(?<=[>])图案表示匹配立即前面有[^])\t{2,}|(?<=[>]图案的位置,这是一个否定的字符类匹配任何单个字符但]),制表符,{2,}单个正回顾后发,|,(,?,<,=, [,>。从[^到最后]的所有字符都是“否定的”,因为^之后的第一个]被视为字面]符号。

你可以看到它匹配S后位置regex demo here

enter image description here

基本上,你需要时刻注意的是没有字字符的字符,并发挥它的安全,你可以逃避所有非字词的字符。

在字符类,只有4个字符是“特殊”:

^ 
] 
\ 
- 

如果你想避免误解,总是逃避它们。

如果你希望你的老板/客户面前炫耀,请注意您不必如果逃脱他们...

  • -:如果它出现在字符类的结尾/开始,或字符与有效范围/速记字符类之间,并且如果它不是字符类减法构造的一部分
  • ]:如果它出现在字符类的开头并且它不是字符类中唯一的字符字符类
  • ^ - 如果它不是第一个字符积极的角色类。

而且\必须总是进行转义。

+1

你在哪里看到[^>]在给定的模式?如果你正在谈论一个恰好包含>的单个字符类,请这么说。 – BoltClock

+1

@BoltClock它在[评论](https://stackoverflow.com/questions/46588130/what-does-match-in-c-sharp-regex/46588503#comment80129827_46588130)。其实,我只是想提供一个有效的简单否定字符类的例子。 –

+1

@WiktorStribiżew我认为你在看['>]'而不是'[^>]'。 – mac9416