使用Regex vs includes()方法和Switch Statment

时间:2015-09-11 14:29:13

标签: javascript regex

我向OpenWeatherMap.org API发出AJAX请求以获取当地天气预报(温度,城市和天气描述)。我正在将天气描述分配给变量" weatherDescription"。我正在使用switch语句来检查" weatherDescription"有"云"例如,在描述中,如果它确实将DOM内元素图像的图标改变为"阴天"图标图片。

以下代码适用于Chrome,但遗憾的是.includes()方法在其他浏览器(Safari,IE,Opera等)中不起作用。

function SwitchIcons() {
        switch (true) {
          case (weatherDescription.includes('clear')):
            icon.className = "";
            icon.classList.add("wi", "wi-day-sunny");
            break;
          case (weatherDescription.includes('rain')):
            icon.className = "";
            icon.classList.add("wi", "wi-day-rain");
        }
      }
      SwitchIcons();

所以,我现在正在测试" weatherDescription"对于regExp,但条件总是在第一种情况下返回true(例如下面的例子):

var myRegExp = /sun|rain|sleet/ig; 
switch (true) {
              case myRegExp.test(weatherDescription)):
                icon.className = "";
                icon.classList.add("wi", "wi-day-sunny");
                break;
case myRegExp.test(weatherDescription)):
icon.className = "";
icon.classList.add("wi", "wi-day-rain");
}

是否有可能通过regEx使用.includes()方法获得相同的结果,还是有更好的方法来实现这一目标?

1 个答案:

答案 0 :(得分:2)

问题是g修饰符。第二次调用test将尝试匹配从上一个匹配开始,而不是在字符串的开头。 JavaScript中的正则表达式对象具有状态,当您将gtestexec及类似内容一起使用时,这很重要。

这是一个更简单的例子来说明问题:



var rex;
rex = /test/g;
snippet.log(rex.test("test")); // true
snippet.log(rex.test("test")); // false
// vs.
rex = /test/;
snippet.log(rex.test("test")); // true
snippet.log(rex.test("test")); // true

<!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 -->
<script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>
&#13;
&#13;
&#13;