LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 189|回复: 0

前瞻断言

[复制链接]
发表于 2024-1-19 23:32:53 | 显示全部楼层 |阅读模式
语法为:x(?=y),它表示“仅在后面是 Y 时匹配 X”。这里的 X 和 Y 可以是任何模式。

那么对于一个后面跟着 € 的整数,正则表达式应该为:\d+(?=€)。

let str = "1 turkey costs 30€";

alert( str.match(/\d+(?=€)/) ); // 30,数字 1 被忽略了,因为它后面没有 €
请注意:前瞻断言只是一个测试,括号 (?=...) 中的内容不包含在匹配结果 30 中。

当我们查找 X(?=Y) 时,正则表达式引擎会找到 X,然后检查其后是否有 Y。如果没有,则跳过潜在匹配,并继续搜索。

更复杂的测试也是可能的,例如 X(?=Y)(?=Z) 表示:

寻找 X。
检查 Y 是否紧跟在 X 之后(如果不是则跳过)。
检查 Z 是否也在 X 之后(如果不是则跳过)。
如果两个测试都通过了,那么 X 是匹配的,否则继续搜索。
换句话说,这样的模式意味着我们同时在寻找 X 后跟 Y 和 Z。

这只有在模式 Y 和 Z 不是互斥的情况下才可行。

例如,\d+(?=\s)(?=.*30) 查找后跟着空格 (?=\s) 的 \d+,并且有 30 在它之后的某个地方 (?=.*30):

let str = "1 turkey costs 30€";

alert( str.match(/\d+(?=\s)(?=.*30)/) ); // 1
在我们给出的字符串中,与数字 1 完全匹配。

否定的前瞻断言
假设我们想要一个数量,而不是来自同一字符串的价格。那是一个数字 \d+,后面不是 €。

为此,我们可以使用否定的前瞻断言。

语法是:X(?!Y),意思是“搜索 X,但前提是后面没有 Y”。

let str = "2 turkeys cost 60€";

alert( str.match(/\d+\b(?!€)/g) ); // 2(价格不匹配)

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表