我有几个要使用正则表达式提取名称的字符串。全名与字符串的任何其他部分一样在一个或多个管道中。
每个字符串可能为空,有些示例:
"Women's College Hospital|76 Grenville Street|ACTT Clinic 6 East|Toronto ON M5S 1B2"
""
"Health and Wellness Center|University of Toronto|214 College Street, Room 111|Toronto ON M5T 2Z9"
"Royal Health Care Centre|130 Adelaide St. West|Lower Concourse|P.O.Box 92|Toronto ON M5H 3P5"
"Suite 1038|790 Bay Street|P.O. Box 51|Toronto ON M5G 1N8
M5G 1N8"
"P.O. Box 19569|Toronto ON M4W3T9"
我有这个正则表达式
^(.*\|)*((?i).*(room|st.|street|road|avenue|P.O.|St.).*\|(?-i).*)$
如果字符串中只有一个匹配项,它将很好地分组。
但是,如果存在一个以上的迭代或另一匹配,它将与 最后一次迭代或最后一场比赛。
例如,对于字符串
"Sleep & Alertness Clinic|790 Bay street |Suite 800| st. 32|Toronto ON M5G 1N8"
结果是:
我想要的是:
答案 0 :(得分:2)
在正则表达式中,您可以向.*
添加一个问号以使其不贪婪,并在第一个匹配项后停止。
^(.*?(?:room|st\.|street|road|avenue|P\.O\.)[^|]*)(.*)$
答案 1 :(得分:2)
您要查找的表达式可能很简单:
"(.*?)\|(.*)"
您很可能不需要,也不需要锚点^
和$
,但是如果出于某些原因想要它们,也可以考虑添加其他边界。
您可以在regex101.com中设计/修改/更改表达式。
您可以在jex.im中可视化您的表情:
const regex = /"(.*?)\|(.*)"/gmi;
const str = `"Women's College Hospital|76 Grenville Street|ACTT Clinic 6 East|Toronto ON M5S 1B2"
""
"Health and Wellness Center|University of Toronto|214 College Street, Room 111|Toronto ON M5T 2Z9"
"Royal Health Care Centre|130 Adelaide St. West|Lower Concourse|P.O.Box 92|Toronto ON M5H 3P5"
"Suite 1038|790 Bay Street|P.O. Box 51|Toronto ON M5G 1N8 M5G 1N8"
"P.O. Box 19569|Toronto ON M4W3T9"
"Sleep & Alertness Clinic|790 Bay street |Suite 800| st. 32|Toronto ON M5G 1N8"`;
let m;
while ((m = regex.exec(str)) !== null) {
// This is necessary to avoid infinite loops with zero-width matches
if (m.index === regex.lastIndex) {
regex.lastIndex++;
}
// The result can be accessed through the `m`-variable.
m.forEach((match, groupIndex) => {
console.log(`Found match, group ${groupIndex}: ${match}`);
});
}
如果确实需要在第一组中添加管道,则可以简单地将其添加到replace中,也可以将其包装到另一个捕获组中。