这是怎么回事?操作员在regex工作?

这是怎么回事?操作员在regex工作?,regex,Regex,^.*(=.[0-9]).*$ 我在别人的密码里看到了这个。这是有效的正则表达式吗?我知道?应该使前面的项目成为可选的,就像abc?使c成为可选的一样。但是?位于捕获括号的开头。这是什么意思??单独的意思是:可以选择匹配之前的内容 但是,(?…)用于断言 在您的例子中,(?=是一个前瞻性断言,意思是:如果后面有(括号中的内容),则匹配 参考文献 (?:…) 非捕获括号。对包含的模式进行分组,但 不提供匹配文本的捕获。效率更高一些 而不是捕获括号 (?>…) 原子匹配圆括号。圆括号的第一个匹配

^.*(=.[0-9]).*$


我在别人的密码里看到了这个。这是有效的正则表达式吗?我知道
应该使前面的项目成为可选的,就像
abc?
使
c
成为可选的一样。但是
位于捕获括号的开头。这是什么意思?

单独的意思是:可以选择匹配之前的内容

但是,
(?…)
用于断言

在您的例子中,
(?=
是一个前瞻性断言,意思是:如果后面有(括号中的内容),则匹配

参考文献
(?:…)

非捕获括号。对包含的模式进行分组,但 不提供匹配文本的捕获。效率更高一些 而不是捕获括号

(?>…)

原子匹配圆括号。圆括号的第一个匹配 子表达式是唯一尝试过的;如果它不能导致全局 模式匹配,将匹配搜索备份到 “(?>”

(?#…)

自由格式注释(?#注释)

(?=…)

前瞻断言。如果括号中的模式 在当前输入位置匹配,但不推进输入 位置

(?!…)

否定的前瞻性断言。如果括号中包含 模式在当前输入位置不匹配。不前进 输入位置

(? 否定的查找后断言。如果括号中包含 模式与当前输入位置之前的文本不匹配,为 匹配的最后一个字符是前面的输入字符 当前位置。不改变输入位置。的长度 不能删除由后向查找模式匹配的可能字符串 无界(无*或+运算符。)


我在php.net()上找到了PCRE的文档这是教正则表达式的许多功能的一个很好的参考。它包括lookaheads、lookbehinds等。正则表达式中的
有许多不同的用途!哦,我明白了,这些是特定于PHP的?还是通用正则表达式语法?它们是通用的。正则表达式的某些实现可能不支持所有功能是的,但是语法非常标准。主要区别在于是实现POSIX还是PCRE正则表达式。POSIX通常主要出现在*nix命令行/shell系统中,而PCRE是来自Perl的,功能更丰富,使用更频繁。嗯,我仍在努力理解这个操作符是如何工作的。我有一个示例字符串
abc=dfg9abc
并且它与regex
*(.[0-9]).*
*(=.[0-9]).
一起工作,但是我如何修改字符串以与
*(?=.[0-9]).
一起工作?@Jonas它当然也可以(不做任何修改).看一看:那么你的意思是
?=
一起是一个运算符?我以为它在搜索一个
=
等于。你能给我一个例子说明
(.[0-9])
会有什么不同吗?@EliSand,这个也是一个很好的资源…很好地指出了这一点!;-)@Jonas在这个非常特殊的例子中,我怀疑它会有什么不同。但我会给你一个例子:检查这个()(没有前瞻性断言)和这个()…你会看到不同之处…;-)对不起,我把我的评论移到了poster上,因为它比这里更有意义。不过除了断言之外,
最整洁的地方是能够像
*?
这样切换贪婪。@Jonas-断言基本上确保你要找的东西存在(在前面或后面),但它不会“消耗”匹配,这意味着当正则表达式解析器移动到模式的下一部分时,它将继续从命中断言时正确的位置进行搜索。当您掌握了诀窍时,断言非常强大。