我如何匹配“abc?def?”但不是“abc ?? def?”

时间:2012-08-17 23:37:21

标签: regex

我正在尝试以下方法:

.+\?[^\?].+\?

也就是说,匹配所有内容直到“?”,然后,如果没有其他“?”之后,匹配所有内容直到另一个“?”。我猜它不起作用,因为第一个。+已匹配整个字符串。

1 个答案:

答案 0 :(得分:4)

您的描述不准确,但这是我认为您需要正则表达式来满足的规则:

  1. 零个或多个不是'?'的字符
  2. A'?'
  3. 一个或多个不是'?'的字符
  4. A'?'
  5. 这实际上很简单。

    [^?]*\?[^?]+\?
    

    请注意,这将匹配较大字符串的子字符串。如果您需要确保整个字符串与此字符串完全匹配,请输入^$个锚点:

    ^[^?]*\?[^?]+\?$
    

    说明:

    1. ^

      字符串的开头。在多行上下文中,这也匹配行的开头,但您可能不在多行上下文中。

    2. [^?]

      匹配任何非文字字符“?”。

    3. *

      匹配前一个标记的零个或多个。

    4. \?

      匹配文字“?”。

    5. [^?]

      匹配任何非文字字符“?”。

    6. +

      匹配前一个标记中的一个或多个。这样可以确保您不能连续使用两个“?”。

    7. \?

      匹配文字“?”。

    8. $

      匹配字符串的结尾(或多行上下文中的行尾)。


    9. 注意:我在第一个'?'之前假定零或更多非'?'。这将匹配?abc?之类的内容。如果这是非法的,请将第一个*更改为+