【问题标题】:Carets in Regular Expressions正则表达式中的插入符号
【发布时间】:2013-06-01 09:57:09
【问题描述】:

具体来说,^ 什么时候表示“匹配开始”,什么时候表示正则表达式中的“不是以下”?

从 Wikipedia 文章和其他参考资料中,我得出的结论是,前者在开头,后者在与括号一起使用时,但程序如何处理插入符号位于开头和括号的情况?例如,^[b-d]t$ 匹配什么?

【问题讨论】:

    标签: regex caret


    【解决方案1】:

    ^ 仅在[] 的内部和开头表示“不是以下”,所以[^...]

    当它在[] 内部但不是开头时,它表示实际的^ 字符。

    当它被转义时(\^),它也意味着实际的^ 字符。

    在所有其他情况下,它表示字符串/行的开头(取决于语言/设置)。

    简而言之:

    • [^abc] -> 不是 a、b 或 c
    • [ab^cd] -> a、b、^(字符)、c 或 d
    • \^ -> ^ 字符
    • 其他任何地方 -> 字符串/行的开头。

    所以^[b-d]t$ 的意思是:

    • 行首
    • b/c/d 字符
    • t 字符
    • 行尾

    【讨论】:

    • 回答得很好。
    • When it's inside [] but not at the start, it means the actual ^ character. Java 中的不同可能性。
    • In all other cases it means start of the string / line (which one is language / setting dependent). 这不是真正的依赖,其含义是特定于正则表达式引擎的,它们在这方面大多相同。
    • [^\^] 不是克拉!
    【解决方案2】:

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

    查看完整的正则表达式信息https://docs.microsoft.com/en-us/dotnet/standard/base-types/regular-expression-language-quick-reference

    请注意,^\s* 当然可以,但它匹配了许多可以跨行的不必要的cruft

    【讨论】:

      猜你喜欢
      • 2011-07-28
      • 2011-08-20
      • 1970-01-01
      • 2011-01-07
      • 1970-01-01
      • 2017-08-28
      • 1970-01-01
      • 2010-09-14
      • 2021-05-02
      相关资源
      最近更新 更多