【问题标题】:Regex matching any or no character except for given exceptions正则表达式匹配任何字符或不匹配任何字符,除了给定的例外
【发布时间】:2015-06-02 11:06:56
【问题描述】:

我正在尝试匹配一个前面没有字符的字符串,但可能什么都没有。

示例:我想匹配括号中“test”的所有情况,除非它们前面带有“[”或“|”。

示例字符串:

(1) {this is a test}              // match
(2) {this [is] also a test }      // match
(3) {test}                        // match
(4) {this is the third |test}     // no match
(5) {this is the third [test}     // no match

我的第一次尝试是这样的:

\{.*[^\||\[]test.*\}

当然,这不匹配 (3),因为括号和“test”之间没有字符。

然后我尝试了否定的环顾:

\{.*(?!\||\[)test.*\}

但这匹配所有示例字符串。显然,javascript 或我正在使用的环境不支持lookbehind。

有没有办法做到这一点?我错过了什么?

谢谢。

【问题讨论】:

  • 请注意,字符类中的test匹配test字母的任意组合。
  • @MarounMaroun:我完全没有使用正则表达式的经验,但是在给定的搜索模式中我没有看到包含“test”的字符类。
  • 你说得对,我的错 :) 但我的笔记仍然有效 ;)
  • @JulianHzg 你想只匹配字符串test 吗?
  • @AvinashRaj 我想匹配整件事。 (并将“测试”之前和之后的部分存储在变量中,但这不应该是我认为的问题)。

标签: regex regex-negation


【解决方案1】:

如果您的语言不接受lookbehinds,那么您可以考虑以下基于正则的正则表达式。

^(?=\{)[^}]*?[^\[|]test[^}]*}

DEMO

【讨论】:

    【解决方案2】:

    您可以使用以下正则表达式:

    \{[^\{\}]*(?<![\[|])test[^\{\}]*\}
    

    步骤:

    • \{,从左大括号开始。
    • [^\{\}]*,后跟零个或多个非大括号。
    • (?|或[之后的测试。
    • [^\{\}]*,后跟零个或多个非大括号。
    • \},后跟右大括号。

    【讨论】:

    • 谢谢,如果后视能够发挥作用,这似乎是正确的解决方案。鉴于不幸的限制,Avinash Raj 提供的解决方法正是我所需要的。
    • 没问题,只要你下次提到编程语言:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-22
    • 2012-04-03
    • 1970-01-01
    • 1970-01-01
    • 2013-08-02
    相关资源
    最近更新 更多