理解正则表达式

时间:2012-10-03 14:49:26

标签: javascript jquery regex

jQuery datatables库文件中有一个构造正则表达式的方法。谁能告诉我以下正则表达式意味着什么 -

^(?=.*?il)(?=.*?oh).*$

2 个答案:

答案 0 :(得分:9)

^

匹配输入的乞讨。这匹配一个位置,而不是一个字符(将其视为字符之间的空格)。

(?=)

这被称为前瞻。再次,这匹配一个位置。它匹配的位置是紧靠当前位置前面的文本等于给定文本的位置,但“指针”不向前移动。可以想象它就像没有弹出一样偷看。

.*?il

匹配任意数量的任何字符(默认情况下除了换行符),后跟字符“il”。

.*?oh

与上述相同,除了字符“oh”。

$

匹配输入的结尾。

基本上,这个正则表达式是检查输入字符串是否包含字符“il”和“oh”。

<强>打个比方:
想想这样。你有一个人的阵容,你升到第一个人(^)。然后你一次向前看一个人,直到你找到一个戴着红色帽子的人,紧接着是一顶黄色的帽子。 ((?=.*?il))。你的眼睛会回到阵容中的第一个人身上并重复搜索,除非这次你正在寻找一个戴着紫色帽子的人,然后立即戴上绿帽((?=.*?oh))。最后,你走过所有人,将每个人拉出阵容,直到你走到行尾(.*$)。如果,在任何时候,你找不到你想要的东西,你就会转身离开房间(相当于返回假)。否则,在阵容结束后,你大喊“糖果!” (相当于返回true)。

兴趣点:
前瞻者使用所谓的“非贪婪”量词(*?)。这基本上说“尽可能多地匹配,但不能更多”。贪婪的量词(*)表示“尽可能多地匹配”。如果使用了贪婪的量词,则相当于将眼睛移动到阵容的后面,然后向前扫描,在第一场比赛时停止(如果从前面算起,这将是阵容中的最后一场)。

如果你要删除输入锚点(^)的开头,那么这个表达式很容易受到灾难性的回溯。由于前瞻基于位置匹配,如果它不匹配,那么它将尝试前进一个字符并再次尝试。 ^使前瞻停留在输入中的第一个位置。如果他们无法从那个位置找到他们想要的东西,那么他们就会失败。

.*$部分是绒毛。您可以在不影响表达式的情况下将其删除(编辑:实际上,如果您只是测试输入,那就是真的。您正在使用结果匹配,那么您需要.*来生成非零值-length string )。但是,如果要确保输入是一定长度,则使用.{5,10}$代替。这就像走过阵容一样,计算出你拔出的人数,只会大喊“糖果!”如果您找到了至少5个人但不超过10个(替代方案:{5,} - 至少5个字符没有上限; {,10} - 不超过10个字符且没有下限。鉴于您已经在寻找字符“il”和“oh”,已经隐含要求输入至少为4个字符(没有上限)。

答案 1 :(得分:1)

您可以使用http://gskinner.com/RegExr/来帮助分析大多数正则表达式,并根据输入数据对其进行测试。互联网上有一些像这样的工具。这个需要Flash。 (这不是卖点,只是信息。)

请注意,我提供的网址在 regex 的代码维基页面中提及。