Eaten by a Grue Asked: 2024-10-10 00:48:10 +0800 CST2024-10-10 00:48:10 +0800 CST 2024-10-10 00:48:10 +0800 CST 为什么正则表达式前瞻和后瞻与锚点 ^ 的行为相同 772 我刚刚读了这个答案,但无法理解它为什么有效。似乎这两种模式(负向前瞻和负向后瞻)都会匹配字符串开头的- not : (?!^)- (?<!^)- 类似地,正向前瞻和正向后瞻的行为相同,都会匹配-字符串开头的 a: (?=^)- (?<=^)- 但这种行为似乎只适用于使用^锚点时的前瞻和后瞻模式。换句话说,它们的行为与下面的预期一致,其中只有第二个模式(正后瞻)会匹配X-。 (?=X)- (?<=X)- 有人可以解释一下这个机制吗? regex 1 个回答 Voted Best Answer Barmar 2024-10-10T01:11:02+08:002024-10-10T01:11:02+08:00 当正则表达式引擎处理前瞻时,它会检查输入的后续部分是否与模式匹配,但不会推进输入中的位置。因此,如果前瞻之后有内容,则它必须与前瞻在同一个位置匹配。 当前瞻包含零宽度断言(如^或 )时,这种方法可以正常工作\b。但是,如果它包含匹配 1 个或多个字符的内容,则前瞻后的模式必须在同一位置匹配。由于X和-不能同时匹配同一个字符,因此(?=X)-永远不会成功。另一方面,像 这样的模式(?=X.*).*-可以起作用,因为.*允许匹配包含 的部分X。 后视工作方式不同,因为它断言主模式之前的文本匹配。它会向后查找,因此它不需要后视匹配与主匹配位于同一位置。
当正则表达式引擎处理前瞻时,它会检查输入的后续部分是否与模式匹配,但不会推进输入中的位置。因此,如果前瞻之后有内容,则它必须与前瞻在同一个位置匹配。
当前瞻包含零宽度断言(如
^
或 )时,这种方法可以正常工作\b
。但是,如果它包含匹配 1 个或多个字符的内容,则前瞻后的模式必须在同一位置匹配。由于X
和-
不能同时匹配同一个字符,因此(?=X)-
永远不会成功。另一方面,像 这样的模式(?=X.*).*-
可以起作用,因为.*
允许匹配包含 的部分X
。后视工作方式不同,因为它断言主模式之前的文本匹配。它会向后查找,因此它不需要后视匹配与主匹配位于同一位置。