2

感谢所有回复的人。
我想我必须稍微调整一下我的第一个问题。由于 $ 符号的定义,我有点困惑。它只是断言字符串的末尾有 6 到 10 个单词字符。
而已!正确的?然后,我认为它必须与我的测试字符串匹配"123a56A781231231231241"。因为它不违反规则! 字符串开头和结尾处的 6-10 个单词字符。完美,不是吗?

^(?=\w{6,10}$)另外,我想知道和之间的区别^(?=\w{6,10})$

还有一个,Casimir et Hippolyte你说+ 不会改变任何东西,这仅意味着量词(这里的 {6,10} )是所有格并且不允许回溯。 这是否意味着 + 符号使 $ 符号禁用?

提前谢谢你们。

在我继续之前,我想让你们知道,距离我开始学习正则表达式只有两天时间。我完全是新手。

第一的。^(?=\w{6,10}$)这是模式。为什么美元信号必须在里面()?我知道这是一个愚蠢的问题,但我很好奇。我试图在(). 但它并没有像我预期的那样工作。

第二。我找到了几个教程网站,上面写着美元符号的意思

"$可能出现在模式的末尾以要求匹配出现在一行的最后。例如,abc$匹配123abc但不是abc123."

So$用于断言字符串的匹配部分位于行尾。正确的?

如果这是真的,为什么这个模式:"^(?=\w{6,10}$)"不能与我的测试字符串匹配:"123a56A781231231231241"

如您所见,我的测试字符串在行首包含 6~10 个单词字符,在行尾包含 6~10 个单词字符。

第三。正如我之前提到的,这种模式:^(?=\w{6,10}$)无法与我的测试字符串匹配:"123a56A781231231231241"但是!如果我在喜欢+的后面添加标志, 它就可以工作。是因为符号是所有格吗?我的意思是,据我所知,+ 号告诉引擎一旦进行匹配就不要回溯。所以我冒险猜测,$ 符号没有做他的工作,因为它甚至不做回溯(我不确定这一点,当然,因为我不知道 $ 符号后面是如何工作的)。这样对吗?\w{6,10}^(?=\w{6,10}+$)+

4

3 回答 3

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
于 2013-06-27T14:14:58.403 回答
2
  1. 我无法帮助你,因为我不知道你的意思。您是否尝试匹配23中的测试字符串?

  2. ^(?=\w{6,10}$)正在尝试匹配字符串的开头,后跟 6-10 个单词字符和字符串的结尾。您的字符串长度超过 10 个字符,因此不匹配。

  3. 添加时,+它匹配6-10 个字符串的一个或多个实例。

    添加+应该仍然不匹配,因为无论哪种方式,您都希望匹配 6-10 个字符长的字符串,但您的测试字符串更长。在这种情况下,使其具有所有格不会改变匹配。

于 2013-06-27T14:10:36.853 回答
2

(?=..)是一个前瞻,它是一个零宽度断言,这意味着它只是一个检查并且不匹配任何内容。换句话说,前瞻意味着跟随

图案的^(?=\w{6,10}$)意思是:

字符串的开头,后跟 6 到 10 个单词字符,直到字符串的结尾。

请注意,没有任何字符匹配,因为所有字符都在前瞻中,除了 ^ 也是零宽度。

匹配函数只能返回一个空字符串作为匹配结果,但如果条件满足则返回真(否则为假)

+ 不会改变任何东西,这仅意味着量词({6,10}此处)是所有格并且不允许回溯。有关此功能的更多信息,请访问:www.regular-expressions.info/possessive.html

于 2013-06-27T14:27:43.993 回答