构建一个正则表达式来捕获INT。,EXT。,INT。/ EXT。等

时间:2017-02-03 23:36:29

标签: php regex

我正在处理一系列文字,其中我正在寻找以下字符串:

  • INT。
  • EXT。
  • INT./EXT。
  • EXT./INT。

正在分析的文本是,例如,

17   INT.   BLOOM HOUSE - NIGHT                                  17
27   INT./EXT.   BLOOM HOUSE - (PRESENT) DAY                      27
例如,

在php中调用 preg_match("/^\w.*(INT\.\/EXT\.|EXT\.\/INT\.|EXT\.|INT\.)(.*)$/", $a_line, $matches);

并且那些不完全正确处理贪婪的变体(或者我认为,无论如何),并且遗漏了一些东西,通常是INT./EXT.EXT./INT.项。有什么建议?谢谢!

1 个答案:

答案 0 :(得分:1)

是的,您需要使用与\w.*?的懒点匹配,但您也可以优化模式以缩短交替组,如下所示:

/^\w.*?(INT\.(?:\/EXT\.)?|EXT\.(?:\/INT\.)?)(.*)$/

请参阅regex demo

另外,如果您要整体处理文本,则需要/m多行修改。

<强>详情:

  • ^ - 字符串的开头
  • \w - 一个字char
  • .*? - 除了换行符之外的任何0 +字符尽可能少到第一个字符
  • (INT\.(?:\/EXT\.)?|EXT\.(?:\/INT\.)?) - 第1组捕获:
    • INT\.(?:\/EXT\.)? - INT.后跟可选的/EXT. substring
    • | - 或
    • EXT\.(?:\/INT\.)? - EXT.后跟可选的/INT. substring
  • (.*) - 第2组:除了换行符之外的任何0 +字符...
  • $ - 字符串结束。