正则表达式用于捕获第一次迭代

时间:2019-05-14 19:32:16

标签: regex regex-lookarounds regex-group regex-greedy

我有几个要使用正则表达式提取名称的字符串。全名与字符串的任何其他部分一样在一个或多个管道中。

每个字符串可能为空,有些示例:

"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"

结果是:

  1. 第1组:睡眠与警觉诊所|海湾大街790号|
  2. 第2组。32st。| Suite 800 | Toronto ON M5G 1N8

我想要的是:

  1. 第1组。睡眠与警觉诊所|
  2. 第2组。海湾街790号| 32街| Suite 800 |多伦多ON M5G 1N8

2 个答案:

答案 0 :(得分:2)

在正则表达式中,您可以向.*添加一个问号以使其不贪婪,并在第一个匹配项后停止。

^(.*?(?:room|st\.|street|road|avenue|P\.O\.)[^|]*)(.*)$

Here is a demo

答案 1 :(得分:2)

您要查找的表达式可能很简单:

"(.*?)\|(.*)"

您很可能不需要,也不需要锚点^$,但是如果出于某些原因想要它们,也可以考虑添加其他边界。

RegEx

您可以在regex101.com中设计/修改/更改表达式。

enter image description here

RegEx电路

您可以在jex.im中可视化您的表情:

enter image description here

JavaScript测试

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中,也可以将其包装到另一个捕获组中。