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这样的人物。
答案 0 :(得分:1)
您可以使用/\b[AP]M\W+(?:-\W+)?([^:]+):/
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;
模式详情:
\b
- 字边界[AP]M
- AM
或PM
\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示例。