检查字符串是否以标点符号开头(Javascript)

7
如何使用Javascript检查数据字符串是否以标点符号开头?我查看了Check if string is a punctuation characterHow to know that a string starts/ends with a specific string in jQuery?和其他一些问题,但我无法确定自己哪里出错了。
以下是我目前的代码片段:
      var punctuations = [".", ",", ":", "!", "?"];

      if (d.endContext.startsWith(punctuations)) {console.log(d.endContext)
      } else {console.log('false')};

我只得到"false"的返回值,但如果我传入"."
if(d.endContext.startsWith('.'))
... 

我得到了正确的结果。我还尝试过

     String punctuations = ".,:;?!"

就像检查字符串是否为标点符号所建议的一样,但是Chrome和Firefox都给我报错信息(“未捕获的语法错误:意外的标识符”和“语法错误:声明之前缺少;”,分别)。这似乎通常是用JavaScript编写多行字符串时出现的错误,但我不认为我正在尝试这样做。d.endContext将打印多行字符串,但当我只传递"."时,它可以正常工作,所以我认为这不是问题所在。


使用 RegExp 来测试字符串。 - Blindman67
4个回答

22
使用正则表达式更简单。
    var str = '.abc'
    var result = !!str.match(/^[.,:!?]/)
    
    console.log(result)
  • / 表示正则表达式的开始/结束

  • ^ 表示以...开头

  • [] 表示字符集,它将匹配在 [] 之间的任何字符

  • !!match 返回 转换为布尔值。如果它返回一个匹配,那么它会转换为 true。如果它返回 null,那么它会转换为 false

此外,这个应用程序非常适合学习正则表达式!http://regexr.com/

祝您拥有美好的一天!:D


能否解释一下 !! 的作用,以及详细说明一下正则表达式的含义,谢谢。 - low_rents
这对我有用,但我同意一些关于 !! 的解释会更有帮助! - westcoast_509
@low,@west,我认为Rokt3r的!!只能是两个“not”运算符的序列,意味着无操作。我会尝试将其删除,看看是否有人反对... - Michael Allan

5

1
@Praveen Kumar - https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/some 我之前也不知道这个,但看起来非常有用。 - neilsimp1
是的,我刚刚发布了一个链接。我认为它是ES6的一部分。 - Richard Hamilton

3

使用Array.prototype.indexOf可能是最简单的方法:

var punctuations = [".", ",", ":", "!", "?"];
var stringToSearch = d.endContext;  // Your string to search
if (punctuations.indexOf(stringToSearch.charAt(0)) !== -1) {
    // Your awesome code goes here
}

它与IE9以及几乎所有版本的Chrome和Firefox兼容(向下兼容至1.5版本),但如果您使用jQuery,可以使用inArray进行进一步的向后兼容。


或者......只是为了好玩,您可以走另一个极端,成为前沿先锋,使用新的ES7 Array.prototype.includes来破坏所有非测试版浏览器:

var punctuations = [".", ",", ":", "!", "?"];
var stringToSearch = d.endContext;  // Your string to search
if (punctuations.includes(stringToSearch.charAt(0))) {
    // Your awesome code goes here
}

兼容以下浏览器:

  • Chrome 47(尚未发布)
  • Firefox 43(尚未发布)

2
这是一个优美的解决方案:
var punctuations = [".", ",", ":", "!", "?"];
var punkyString = ".hello!";
var nonPunkyString = "hello!";

function isPunkyString(str) {
  return punctuations.indexOf(str[0]) > -1;
}

console.log(punkyString, "is punky:", isPunkyString(punkyString));
console.log(nonPunkyString, "is punky:", isPunkyString(nonPunkyString));

单元测试!

var punkyStrings = punctuations.map(function (item) {
    return item + " <---<< Punctuations!"
});

var nonPunkyStrings = punctuations.map(function (item, i) {
    return i + " <---<< No punctuations!"
});

punkyStrings.forEach(function (item, i) {
    console.log("Expect", "isPunkyString(\"" + item + "\")", "to be true:", isPunkyString(item));
});

nonPunkyStrings.forEach(function (item, i) {
    console.log("Expect", "isPunkyString(\"" + item + "\")", "to be false:", isPunkyString(item));
});

为什么这段话很棒?因为我用了“punky”这个词! :D 还有,我把字符串当做数组来处理。这很好!
还有其他人对他们的代码进行单元测试吗? :D

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接