我看到了一本书的描述......
这本书说/^Apple/
将匹配字符串在字符串的开头有一个Apple。
所以它会匹配Apple Apple1 AppleApple AppleABC
......
该书还说/Apple$/
将匹配字符串中有一个Apple的字符串。
所以它会匹配ABCApple 12345Apple
这样的......
但该书说/^Apple$/
仅匹配Apple
。但我很困惑,我认为/^Apple$/
应该匹配字符串“Apple”的开头和字符串“Apple”的结尾,所以像AppleabcApple
这样的东西应该匹配,所以我很困惑。
答案 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