2

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

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

书上还说/Apple$/将匹配的字符串在字符串的末尾有一个Apple。所以它会ABCApple 12345Apple像那样匹配....

但书上说/^Apple$/只会配Apple。但我很困惑,我认为/^Apple$/应该匹配以字符串“Apple”开头和字符串“Apple”结尾的字符串,所以AppleabcApple应该匹配,所以我很困惑。

4

5 回答 5

11

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

因此,^Apple意思是“就在字符串的开头之后,必须有一个 Apple”。Apple$表示“紧随其后Apple必须是字符串的结尾”。因此,^Apple$意味着“在字符串的开头之后是 Apple,之后是字符串的结尾”——因此,^Apple$只能匹配包含完全Apple不包含其他内容的字符串。

如果你想匹配一个以 开头结尾的字符串Apple,你可以写

/^Apple.*Apple$/

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

于 2013-06-13T04:14:44.427 回答
7

与其将^and$分别视为字符串开头或结尾的匹配词,不如将^and视为字符串$开头和结尾的不可见字符,您可以在正则表达式中进行匹配。

搜索apple$意味着您正在寻找apple紧随其后的字符串结尾“字符”的字符串。和类似的概念^

因此,要匹配^apple$,字符串的开头必须紧接'apple' 之前,结尾必须紧接'apple' 之后。

于 2013-06-13T04:14:26.193 回答
5

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

/^Apple|Apple$/
于 2013-06-13T04:13:09.897 回答
3

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

/^Apple/ 匹配任何以 "Apple" 开头的字符串,但这是因为模式是字符串 ( ^)的开头,紧跟一个大写字母,A紧跟一个小写字母p,等等。

同样,/Apple$/ 匹配任何以“Apple”结尾的字符串,但这是因为该模式是“Apple”的文字字符串,紧跟在字符串的末尾。

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

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

/^App.*le$/

你可以匹配任何以“App”开头并以“le”结尾的字符串,它们之间有各种各样的字符(.不匹配所有字符,但它匹配许多字符)。

于 2013-06-13T04:16:58.167 回答
2

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

于 2013-06-13T04:09:50.777 回答