【问题标题】:Lookahead (?=pattern) without preceding pattern [duplicate]没有前面的模式的前瞻(?=模式)[重复]
【发布时间】:2016-03-11 18:35:10
【问题描述】:

我了解到前瞻正则表达式是这样的 x(?=y) 并且意味着

仅当 x 后跟 y 时才匹配 x。

根据MDN。但是我在w3school 上找到了这段代码:

<p>A form with a password field that must contain 8 or more characters that are of at least one number, and one uppercase and lowercase letter:</p>

<form action="demo_form.asp">
Password: <input type="password" name="pw" pattern="(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,}" title="Must contain at least one number and one uppercase and lowercase letter, and at least 8 or more characters">
<input type="submit">
</form>

为什么 (?=.*\d) 表示“字符串中至少出现一个数字”?三对括号在哪里匹配并不重要,因为在我看来,它应该是第一个或多个数字后跟一个或多个小写字母,然后是一个或多个大写字母,然后是 8 个或更多字符,怎么了?

经过一番搜索,似乎正则表达式在各种语言中有所不同,这是什么意思?

编辑: 我不认为你们有我的问题。我的意思是前瞻就像 x(?=y),但是 (?=.*\d) 前面没有任何东西,那么匹配什么?第二个问题,三个括号有特定的顺序,但匹配不一定是相同的顺序,因为/abc/匹配“abcdd”而不是“cbdda”----为什么顺序不重要?

更新: 好的,可能我对前瞻有误解,感谢谁为这个问题更改了我的标题。因此,如果之后不再需要,这是我的最后更新:

我的问题就像标题所说的那样,前瞻(?=模式)可以省略前面的模式,那么括号前什么都没有是什么意思?我搜索了“前瞻”,几乎所有解释都带有前面的模式。

我在正则表达式测试器上尝试了一些东西: /(?=\d)/ 如果字符串包含数字,例如“a2”,将创建无限匹配,但如果字符串没有数字,则会显示“不匹配”,例如“a”

有趣的是 /(?=\d)./ 将匹配任何数字,现在它似乎等于 \d

我现在不知道发生了什么,我会再次学习前瞻,但欢迎任何进一步的答案,谢谢

【问题讨论】:

  • “为什么顺序不重要”——因为向前看不会消耗输入。这基本上是我回答的要点……
  • @Drake: * 尽可能多地匹配除换行符以外的零个或多个字符。因此,(?=.*&lt;SOMEPATTERN&gt;) 前瞻只是检查当前行的某个位置是否存在 。如果存在该模式,则返回“true”,引擎会进一步搜索或返回有效匹配。清楚吗?
  • pattern属性值默认是anchored^(?:加在开头,)$加在末尾。因此,前瞻实际上是在匹配开始位置后一一执行的。请参阅this post,了解此类先行是如何工作的。
  • One more explanation: 区别在于lookaround实际上匹配字符,但随后放弃匹配,只返回结果:匹配或不匹配。这就是为什么它们被称为“断言”。它们不消耗字符串中的字符,而只是断言匹配是否可能。.
  • @WiktorStribiżew 非常感谢您的详细解释,我从regular-expressions.info 阅读了这篇文章,并从您引用的行中得到了一些线索。我现在要睡觉了,希望明天我的头脑会更清醒,再次感谢,晚安

标签: javascript regex lookahead


【解决方案1】:

(?=pattern)regex lookahead。它是模式的零宽度、“真或假”部分,实际上不会“吃掉”任何字符,但必须匹配(为真)才能使表达式成功。所以,

(?=.*\d)

的意思是“向前看.*\d,它是'anything'(任意次数,贪婪),后跟一个数字”。由于.* 默认情况下会吃掉所有字符,直到字符串的末尾,显然\d 自己不会吃任何东西。 .* 一次回溯或放弃一个字符,直到 \d 可以匹配。由于* 表示“零或更多”,.* 将放弃它匹配的所有内容,如有必要,让\d 匹配。因此,至少字符串中某处的一个数字足以让模式匹配。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-22
    • 2021-05-11
    • 2019-09-25
    相关资源
    最近更新 更多