JavaScript查找字符串是否具有与给定reg exp匹配的子字符串

时间:2016-09-27 06:46:05

标签: javascript string

var str = "4/16/14, 10:24 AM - John Doe: How is everything going on? Check this: iPhone7!"

我想检查字符串是否包含与AM - <some-name>:匹配的子字符串。例如,在上面的字符串中,它应匹配AM - John Doe:并返回John Doe。 (当然,一旦匹配,我可以使用子字符串获取名称)。此外,有时在AM - John Doe:中可能会有特殊字符而不是空格。正则表达式也适用于这种情况。

例如:

var str1 = "4/16/14, 10:24 AM - John Doe likes your photo";
var str2 = "4/16/14, 10:24 AM John Doe replied to your comment";
var str3 = "4/16/14, 10:24 AM John Doe: Whats going on";
var str4 = "4/16/14, 10:24 AM John Doe: Whats going on : hmmm";

正则表达式应与 str3 str4 匹配,因为它包含以 AM 开头的子字符串并以第一个

结束

对于str3和str4,我想得到John Doe这个名字。 注意:str1和str2也有John Doe,但它没有立即跟踪

表达式我尝试过:

str.match(/[AP]M - \w+[ ]?\w+[ ]?\w+:./);

当存在特殊字符(如UTF-8字符)时,上述操作失败。它不可见,但似乎有像e2 80 80这样的人物。

2 个答案:

答案 0 :(得分:1)

您可以使用/\b[AP]M\W+(?:-\W+)?([^:]+):/

&#13;
&#13;
var str1 = "4/16/14, 10:24 AM - John Doe likes your photo";
var str2 = "4/16/14, 10:24 AM John Doe replied to your comment";
var str3 = "4/16/14, 10:24 AM John Doe: Whats going on";
var str4 = "4/16/14, 10:24 AM John Doe: Whats going on : hmmm";
var ss = [ str1, str2, str3, str4 ]; // Test strings
var rx = /\b[AP]M\W+(?:-\W+)?([^:]+):/; 
for (var s = 0; s < ss.length; s++) {                  // Demo
  document.body.innerHTML += "Testing \"<i>" + ss[s] + "</i>\"... ";
  document.body.innerHTML += "Matched: <b>" + ((m = ss[s].match(rx)) ? m[1] : "NONE") + "</b><br/>";
}
&#13;
&#13;
&#13;

模式详情

  • \b - 字边界
  • [AP]M - AMPM
  • \W+ - 1 +非单词字符
  • (?:-\W+)? - 连字符和非单词char的可选序列
  • ([^:]+) - 第1组(我们的输出)捕获:以外的一个或多个字符
  • : - 冒号。

由于[^...]否定字符类,它将匹配任何字符,直至第一个::除外来自匹配),但模式中的尾随:实际上要求字符串中存在:

答案 1 :(得分:0)

我用你的正则表达式做了一个例子,你可以找到here

正如我所说的那样,通过修改它来使用你的正则表达式:

[AP]M[^a-zA-Z]-[^a-zA-Z]\w+[ ]?\w+[ ]?\w+:.

如果您还要排除数字,可以将其修改为:

[AP]M[^a-zA-Z\d]-[^a-zA-Z\d]\w+[ ]?\w+[ ]?\w+:.

此外,如果您希望名称中包含特殊字符,则可以使用\S代替\w,这将包括除空白字符之外的所有内容。 然后正则表达式就是这样:

[AP]M[^a-zA-Z]-[^a-zA-Z]\S+[ ]?\S+[ ]?\S+:.

我更新了Regex101示例。