感谢所有回复的人
我想我必须稍微调整一下我的第一个问题。
由于$符号的定义,我有点困惑。
它只是断言字符串最后有6到10个字符
而已!对?然后,在我看来,它必须与我的测试字符串"123a56A781231231231241"
匹配。因为它不违反规则!字符串最开头的 6-10个字符,字符串的最后一个字符串。完美,不是吗?
另外,我想知道^(?=\w{6,10}$)
和^(?=\w{6,10})$
之间的区别。
还有一个, Casimir et Hippolyte 你说 + +没有改变任何东西,这意味着只有量词({6,10}这里)占有欲并且不允许回溯。 这是否意味着+符号使$ sign禁用?
提前谢谢你们。
在我继续前进之前,我希望你们知道,自从我开始研究正则表达式以来,仅仅2天。我完全是新手。
首先。 ^(?=\w{6,10}$)
这是模式。为什么美元信号必须在()
之内?我知道这是一个愚蠢的问题,但我很好奇。我试图在()
外面找到美元符号。但它没有按照我的预期发挥作用。
二。我找到了几个教程网站,它说美元符号意味着
“
$
可能会出现在模式的末尾,要求匹配发生在一行的最后。例如,abc$
匹配123abc
但不匹配{{1} }}“
因此abc123.
用于断言字符串的匹配部分位于一行的最后。正确?
如果确实如此,为什么这种模式:$
无法与我的测试字符串匹配:"^(?=\w{6,10}$)"
。
如您所见,我的测试字符串在一行的开头包含6~10个字符,在一行的最后包含6~10个字符。
第三。正如我前面提到的,这种模式:"123a56A781231231231241"
无法与我的测试字符串匹配:^(?=\w{6,10}$)
但是!如果我在"123a56A781231231231241"
之后添加+
符号\w{6,10}
有用。
是因为^(?=\w{6,10}+$)
符号占有欲吗?我的意思是,据我所知,+符号告诉引擎一旦完成匹配就不会回溯。所以我冒险猜测,$ sign不能完成他的工作,因为它甚至没有回溯(我当然不确定这一点,因为我不知道$ sign如何工作)。这样对吗?
答案 0 :(得分:3)
如果这是你的整个正则表达式,你不需要预见。即这两个正则表达式是等价的:
^(?=\w{6,10}$)
^\w{6,10}$
为什么$
需要在括号内?那是因为(锚定的)向前看^(?= \ w {6,10})只是断言在输入的前面有6到10个字符字符。但是如果在输入的前面有超过 6-10个单词字符,它就会成功。
通过将$
放在前方,只有在整个输入中有6-10个字符时才会成功。
如果您还想要另一个限制,那么您只能使用前瞻。例如,匹配
6-10个字符,“a”出现在“b”之前
你会使用正则表达式:
^(?=\w{6,10}$).*a.*b
答案 1 :(得分:2)
我无法帮助你,因为我不知道你的意思。您是否尝试匹配 2 和 3 中的测试字符串?
^(?=\w{6,10}$)
正在尝试匹配字符串的开头,后跟6-10个字符和字符串的结尾。您的字符串超过10个字符,因此不匹配。
添加 +
时,它匹配 6-10个字符串的一个或多个实例。
添加+
仍然不匹配,因为您要查找的字符串恰好匹配6-10个字符长,但您的测试字符串更长。在这种情况下,使其占有欲不会改变匹配。
答案 2 :(得分:2)
(?=..)
是一个先行,它是一个零宽度的断言,这意味着它只是一个支票并且匹配没有。换句话说,前瞻意味着后跟。
模式^(?=\w{6,10}$)
表示:
开始字符串,后跟6到10个字符,直到字符串结尾。
请注意,没有任何匹配的字符,因为所有字符都在前瞻中,例如零也是零宽度。
匹配函数只能返回空字符串作为匹配结果,但如果满足条件则返回true(其他错误)
+不会改变任何东西,这只意味着量词(这里{6,10}
)占有欲并且不允许回溯。有关此功能的更多信息,请访问:www.regular-expressions.info/possessive.html