为什么/ ^ Apple $ /的正则表达式只匹配字符串“Apple”?

时间:2013-06-13 04:08:22

标签: regex perl

我看到了一本书的描述......

这本书说/^Apple/将匹配字符串在字符串的开头有一个Apple。 所以它会匹配Apple Apple1 AppleApple AppleABC ......

该书还说/Apple$/将匹配字符串中有一个Apple的字符串。 所以它会匹配ABCApple 12345Apple这样的......

但该书说/^Apple$/仅匹配Apple。但我很困惑,我认为/^Apple$/应该匹配字符串“Apple”的开头和字符串“Apple”的结尾,所以像AppleabcApple这样的东西应该匹配,所以我很困惑。

5 个答案:

答案 0 :(得分:11)

^表示字符串(或行,取决于您的正则表达式引擎)的开头。 $表示字符串的结尾。这些匹配就像任何字母或数字一样,但匹配“开头”和“结束”而不是特定字符。

因此,^Apple表示“在字符串开头之后,必须有一个Apple”。 Apple$表示“Apple必须在字符串结尾之后”。因此,^Apple$表示“在字符串的开头是Apple之后,之后是字符串的结尾” - 因此,^Apple$只能匹配包含Apple字符串的字符串没有别的。

如果您想匹配以Apple开头的开头的字符串,您可以写

/^Apple.*Apple$/

(如果你想匹配一个可以重叠的字符串,比如eraser(例如匹配eraseraser),事情变得更复杂 - 如果你的正则表达式引擎允许它,你可以尝试混合前瞻/ lookbehind:^(?=eraser).*(?<=eraser)$

答案 1 :(得分:7)

不要将^$分别视为字符串开头或结尾处的匹配字词,而应将^$视为不可见字符在字符串的开头和结尾,您可以在正则表达式中匹配。

搜索apple$表示您正在查找字符串apple,紧接着是字符串结尾的“字符”。和^的类似概念。

因此,要匹配^apple$,字符串的开头必须在'apple'之前立即,并且必须在之后立即苹果”。

答案 2 :(得分:5)

如果您真的想要匹配以Apple开头或以Apple结尾的字符串,请使用此正则表达式:

/^Apple|Apple$/

答案 3 :(得分:3)

您为这些正则表达式提供的描述有点误导。

/^Apple/ 匹配任何以“Apple”开头的字符串,但这是因为该模式是字符串的开头(^),紧接着是一个大写字母{ {1}},紧接着是小写A等等。

同样,p 匹配任何以“Apple”结尾的字符串,但这是因为该模式是字符串“Apple”,后面紧跟字符串的结尾。

这意味着/Apple$/是字符串的开头,紧接着是文字字符串“Apple”,紧接着是字符串的结尾。

因此,模式中没有空间来匹配任何其他内容。如果有一些通配符,例如:

/^Apple$/

你可以匹配任何以“App”开头并以“le”结尾的字符串,其中包含各种各样的字符(/^App.*le$/ 所有内容不匹配,但它匹配很多字符)。

答案 4 :(得分:2)

因为你有两个锚(开始和结束),这意味着“字符串必须正好......”(Apple,在你的情况下)。 要匹配开头的字符串,您可以使用Perrenoud的公式或仅使用/^Apple