2009-02-23 107 views
2

当我遇到这个问题时,我试图为其他人做一个正则表达式。要求是,正则表达式应该返回一组字符串的结果,比如说,“苹果”。例如,考虑以下字符串:Javascript正则表达式

"I have an apple" "You have two Apples" "I give you one more orange"

结果集应该有前两个字符串。

正则表达式(ES)我想是:

/[aA]pple//[^a-zA-Z0-9][aA]pple/

与第一个问题是,像 “aapple”, “bapple” 等字(好了,这是没有意义,但仍然...)对它的测试结果是肯定的,第二个问题是当一个字符串实际上以单词“apple”,“Apple和oranges”开头时,它会测试否定的结果。有人可以解释为什么第二个正则表达式以这种方式行事,以及正确的正则表达式是什么?

回答

8
/(^.*?\bapples?\b.*$)/i 

编辑:上面将匹配包含单词“苹果”的整个字符串,我认为这是你要求的。如果您只是试图查看该字符串是否包含该字词,则以下内容将起作用。

/\bapples?\b/i 

(ES),我尝试的正则表达式是:

/[aA]pple/ and /[^a-zA-Z0-9][aA]pple/

第一个只检查下列字符的存在,依次是:苹果,不管是什么上下文。\ b或单词边界字符匹配任何非单词字符和单词字符相遇的地方,ala \W\w

第二个尝试匹配a-p-p-l-e出现之前的其他字符,并且基本上与第一个相同,除了它前面的其他字符需要

我回答的工作如下。从字符串的开始,匹配任何字符(如果它们存在的话)非贪婪地匹配,直到遇到字边界。如果字符串以苹果开头,字符串的开头是一个字边界,所以它仍然匹配。然后匹配字母a-p-p-l-es(如果存在),后跟另一个字边界。然后它将所有字符匹配到字符串的末尾。/i在最后意味着它不区分大小写,所以'Apple','APPLE'和'apple'都是有效的。

如果您有时间,我会强烈建议您在教程http://regular-expressions.info处穿行。它真的很深入,并讨论了正则表达式引擎如何匹配不同的表达式,它帮助我了很多。

+0

打我吧:) – annakata 2009-02-23 20:29:42

+0

它会失败的苹果核战记,如约翰尼。我怀疑这是一件大事。 – gpojd 2009-02-23 20:33:27

0
/\bapple/i 

\ b是word boundary

为了解释为什么你的尝试不起作用,第一个不检查它是否是单词的开头,所以它可以有一些东西。你给出的第二个正则表达式必须在“apple”之前,但它不能是字母数字。

0

你的第二个正则表达式在第一个苹果之前需要一个非字母数字字符。 “苹果”不满足这一点。正如其他人所指出的,“\ b”不是匹配字符,而是字符边界位置。

3

要建立@ tj111,你的第二个正则表达式失败的原因是[^a-zA-Z0-9]要求一个字符匹配;也就是说,该位置有一些字符,其值不包含在集合[a-zA-Z0-9]中。像\b这样的标记被称为“零宽度断言”。特别是,匹配字符之间的边界或者在字符串的开头或结尾。由于它不匹配任何字符,其“宽度”为零。

总而言之,[^a-zA-Z0-9]要求一个字符不会存在特定的值,而\b只要求存在边界。

编辑: @ tj111在他的回复中增加了大部分内容。我在为时已晚,再次:)

1

这适用于apple和​​其不区分大小写的拼写:

var strings = ["I have an apple", "You have two Apples", "I give you one more orange"]; 
var result = []; 
var pattern = /\bapples?\b/i; 
for (var i=0; i<strings.length; i++) { 
    if (pattern.test(strings[i])) { 
     result.push(strings[i]); 
    } 
}