【问题标题】:Regex select previous occurence正则表达式选择上一次出现
【发布时间】:2014-04-11 17:34:37
【问题描述】:

我正在尝试从具有以下格式的字符串中提取 City 元素:

<BR>Address 1<BR>Address 2<BR>City<BR>A1A 0A0<BR>Phone Number <BR>

<BR>Address 1<BR>Address 2<BR>Address 3<BR>City<BR>A1A 0A0<BR>Phone Number <BR>

输入字符串可以在城市之前有一个随机数的地址项。

到目前为止,我的策略是选择邮政编码(A1A 0A0),然后使用&lt;BR&gt;作为标记提取之前的记录。

到目前为止我正在使用

<BR>(.*)<BR>[ABCEFGHJKLMNPRSTVXY][0-9][ABCEFGHJKLMNPRSTVWXYZ] [0-9][ABCEFGHJKLMNPRSTVWXYZ][0-9]
$1

其中 $1 返回我正在使用的工具(可视网络开膛手)中的第一组正则表达式。但是,该表达式返回邮政编码之前的所有内容。

那么有没有办法让正则表达式不贪婪地选择前一次出现?

【问题讨论】:

    标签: regex


    【解决方案1】:

    所以请耐心等待,但是this is how 我让它工作了:

    (?:<BR>(.*?))+<BR>[ABCEFGHJKLMNPRSTVXY][0-9][ABCEFGHJKLMNPRSTVWXYZ] [0-9][ABCEFGHJKLMNPRSTVWXYZ][0-9]
    

    解释:

    (?:       # Start a non-capturing group (so that we don't have unnecessary matches)
      <BR>    # Look for a <BR> to start the group
      (.*?)   # Then lazily match 0+ characters (lazy will stop us at the next match)
    )+        # End the group and repeat it 1+ times (each field)
    <BR>      # Look for one final <BR> right before the Zip Code
    [...]     # I didn't feel like including the Zip Code logic you wrote :)
    

    但是,根据您的语言,我建议拆分字符串并循环遍历它。 PHP 中的示例:

    $pieces = explode('<BR>', '<BR>Address 1<BR>Address 2<BR>Address 3<BR>City<BR>A1A 0A0<BR>Phone Number<BR>');
    $count = count($pieces);
    
    $city = null;
    for($i = 1; $i < $count; $i++) {
        if(preg_match('/[ABCEFGHJKLMNPRSTVXY][0-9][ABCEFGHJKLMNPRSTVWXYZ] [0-9][ABCEFGHJKLMNPRSTVWXYZ][0-9]/', $pieces[$i])) {
            $city = $pieces[$i - 1];
            break;
        }
    }
    
    var_dump($city);
    // string(4) "City"
    

    【讨论】:

      【解决方案2】:

      我花了一点时间才得到它,但在这里:

      [^>]*<BR>[ABCEFGHJKLMNPRSTVXY][0-9][ABCEFGHJKLMNPRSTVWXYZ] [0-9][ABCEFGHJKLMNPRSTVWXYZ][0-9]
      

      编辑:如果要添加捕获或非捕获组,您可以执行以下操作:


      和邮政编码的非捕获:

      [^>]*(?:<BR>[ABCEFGHJKLMNPRSTVXY][0-9][ABCEFGHJKLMNPRSTVWXYZ] [0-9][ABCEFGHJKLMNPRSTVWXYZ][0-9])
      

      只为城市拍摄:

      ([^>]*)<BR>[ABCEFGHJKLMNPRSTVXY][0-9][ABCEFGHJKLMNPRSTVWXYZ] [0-9][ABCEFGHJKLMNPRSTVWXYZ][0-9]
      

      编辑2:

      根据以下 cmets:仅当城市名称不包含“>”字符时才有效

      【讨论】:

      • 我几乎采用了这种方法,但如果城市包含&gt;,它就会失败(这不太可能,是的)。
      • 哦,我以为城市名称不会包含 > 字符
      • 可能是一个有效的假设,只是想为 OP 做笔记:)
      • 是的,你指出这一点很好,我忘了在我的回答中说明这一点。
      • 希望城市不会包含&gt;,但我们永远不知道!谢谢所有的表达效果很好!我接受了详细解释的另一个答案。
      猜你喜欢
      • 2015-08-14
      • 2012-01-12
      • 1970-01-01
      • 1970-01-01
      • 2016-03-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多