Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/370.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript正则表达式_Javascript_Regex - Fatal编程技术网

Javascript正则表达式

Javascript正则表达式,javascript,regex,Javascript,Regex,当我遇到这个问题时,我正试图为别人做正则表达式。要求正则表达式应该返回一组字符串的结果,这些字符串中有,比如说,“apple”。例如,考虑以下字符串: “我有一个苹果” “你有两个苹果” “我再给你一个橘子” 结果集应具有前两个字符串 我尝试的正则表达式是: /[aA]pple/和/[^a-zA-Z0-9][aA]pple/ 第一个的问题是,像“aapple”、“bapple”等词(好的,所以它们没有意义,但仍然…)用它来测试阳性,而第二个的问题是,当字符串实际上以单词“apple”、“Appl

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

“我有一个苹果”
“你有两个苹果”
“我再给你一个橘子”

结果集应具有前两个字符串

我尝试的正则表达式是:

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

第一个的问题是,像“aapple”、“bapple”等词(好的,所以它们没有意义,但仍然…)用它来测试阳性,而第二个的问题是,当字符串实际上以单词“apple”、“Apples and oranges”开头时,例如,它测试阴性。有人能解释为什么第二个正则表达式是这样的,正确的正则表达式是什么吗

/(^.*?\bapples?\b.*$)/i
编辑:上面的内容将匹配包含单词“apples”的整个字符串,我认为这正是您所要求的。如果您只是想看看字符串是否包含该单词,那么下面的操作就可以了

/\bapples?\b/i
我尝试的正则表达式是:

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

第一个只是检查是否存在以下字符,顺序是:a-p-p-l-e,不管它们在什么上下文中使用。\b或单词边界字符与非单词字符和单词字符相遇的任何位置相匹配,即ala
\W\W

第二种方法是在a-p-p-l-e出现之前尝试匹配其他字符,基本上与第一种方法相同,只是它需要前面有其他字符

我用下面的作品来回答这个问题。从字符串的开头开始,非贪婪地匹配任何字符(如果存在),直到遇到单词边界为止。如果字符串以apple开头,则字符串的开头是单词边界,因此它仍然匹配。然后匹配字母
a-p-p-l-e
,如果存在则匹配
s
,然后匹配另一个单词边界。然后将所有字符匹配到字符串的末尾。结尾的/i表示它不区分大小写,因此“Apple”、“Apple”和“Apple”都有效

如果你有时间的话,我强烈建议你在。它非常深入地讨论了正则表达式引擎如何匹配不同的表达式,这对我帮助很大

/\bapple/i
\b是a


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

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

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

总之,
[^a-zA-Z0-9]
要求存在不带特定值的字符,而
\b
仅要求存在边界


编辑:@tj111在他的回答中添加了大部分内容。我又迟到了:)

这适用于
apple
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]);
    }
}
var strings=[“我有一个苹果”,“你有两个苹果”,“我再给你一个橘子”];
var结果=[];
变量模式=/\b示例?\b/i;

对于(var i=0;iIt在applesed上会失败,就像在Johnny中一样。但我怀疑这有什么大不了的。请不要使用“^.*?”和“*?$”!@Gumbo,这不是必须的,但他正在尝试匹配整个字符串,而不仅仅是单词apple。如果他想捕获整个字符串,他可以在那里加上一些括号。非常感谢您提供的详细答案。但是在apple(s)之前和之后搜索其他字符在这种情况下是多余的,并且被视为产生与排除时完全相同的结果。只需
\baples?\b/i
即可完成此工作。如果我缺少某些内容,请更正,因为我对正则表达式非常熟悉。再次感谢您花时间给出如此详细的答案。我不使用“plzsendtehcodez”问题,所以通常在旁边寻找解释,以便我知道发生了什么以及为什么。你的回答基本上回答了我的两个问题。讨论“零宽度”断言仍然值得a+1。必须热爱正则表达式。信息:)