正则表达式中的插入符号

95
什么情况下,正则表达式中的字符 ^ 表示“匹配字符串的开头”,什么情况下表示“不是以下字符”? 通过维基百科和其他参考资料,我得出结论:^ 表示前者时位于字符串开头,表示后者时需要与括号一起使用。但是,当 ^ 位于开头和括号中时,程序如何处理呢?例如,^[b-d]t$ 匹配什么?
2个回答

207
^只有当在[]内部和开头时才表示“不是以下内容”,因此为[^...]
当它在[]内部但不是开头时,它表示实际的^字符。
当它被转义(\^)时,它也表示实际的^字符。
在所有其他情况下,它表示字符串或行的开头(哪一个取决于语言或设置)。
所以简而言之:
  • [^abc] -> 不是a、b或c
  • [ab^cd] -> a、b、^(字符)、c或d
  • \^ -> 一个^字符
  • 在任何其他地方 -> 字符串或行的开头。
因此,^[b-d]t$的含义是:
  • 行的开头
  • b/c/d字符
  • t字符
  • 行的结尾

2
非常好的回答。 - Ahsan
当它在 [] 内部但不在开头时,它表示实际的 ^ 字符。这在 Java 中有不同的可能性。 - user12097764
在所有其他情况下,它意味着字符串/行的开头(这取决于语言/设置)。实际上并不依赖于具体情况,其含义特定于正则表达式引擎,在大多数情况下都是相同的。 - user12097764
2
[^\^] 不是脱字符! - K0D4
在 PHP 正则表达式中使用 CARAT 表示表达式到达结尾,这个怎么样? - limakid
@K0D4 :你想要的是“非插入符号” [^^],完全跳过反斜杠。 - RARE Kpop Manifesto

0

要忽略块注释? 好的,这个 ^\s* 可能不好用,因为 \s 可以跨行。看看 Dot-net 是否支持水平空格 \h,如果没有,[^\S\r\n] 也可以。可以使用多行内联修饰符 (?m)(或 RegexOptions.Multiline)。这会更改 ^ 的含义,从字符串开头变为行开头(默认值)。所以,它最终变成了 (?m)^\h*(#)。捕获组应该告诉位置。如果没有,那么也一样可以 (?m)(?<=^\h*)#,匹配的位置是偏移量。

请参阅此处以获取完整的正则表达式信息https://learn.microsoft.com/en-us/dotnet/standard/base-types/regular-expression-language-quick-reference

请注意,^\s* 当然可以用,但它会匹配很多不必要的杂质,可能会跨越多行。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接