Php 正则表达式:如何捕获行的开头、模式和结尾?

Php 正则表达式:如何捕获行的开头、模式和结尾?,php,regex,Php,Regex,以下是一些例子: 一些文本A 一些文本A 8:00-19:00 8:00-19:00 一些文本A 8:00-19:00一些文本B 对于上述每个案例,我需要捕获(如果可能): 时间(8:00-19:00) 开头(一些文本A) 结尾(一些文本B) 有了这个模式#^(.*)(\d{1,2}:\d{2}-\d{1,2}:\d{2})?$#,我可以捕获(来自示例2): 一些文本A 8:00-19:00 但我无法通过在模式末尾添加(.*)或(.*)来捕获行的其余部分 你能帮我吗?谢谢大家! 我认为您

以下是一些例子:

  • 一些文本A
  • 一些文本A 8:00-19:00
  • 8:00-19:00
  • 一些文本A 8:00-19:00一些文本B
  • 对于上述每个案例,我需要捕获(如果可能):

    • 时间(
      8:00-19:00
    • 开头(
      一些文本A
    • 结尾(
      一些文本B
    有了这个模式
    #^(.*)(\d{1,2}:\d{2}-\d{1,2}:\d{2})?$#
    ,我可以捕获(来自示例2):

    • 一些文本A
    • 8:00-19:00
    但我无法通过在模式末尾添加
    (.*)
    (.*)
    来捕获行的其余部分


    你能帮我吗?谢谢大家!

    我认为您的主要问题是,您通过在后面添加
    使这组数字成为可选的(我认为您不希望这样)

    <?php
    
        $pattern = <<<REGEX
    /
    (?:
        (.*)?\s*                    #Prefix with trailing spaces
        (
            (?:\d{1,2}:\d{1,2}-?)   #(dd:dd)-?
            {2}                     #2 of those
        )                           #(The time)
        \s*(.*)                     #Trailing spaces and suffix
        |
        ([a-zA-Z ]+)                #Either that, or just text with spaces
    )
    /x
    REGEX;
    
        preg_match($pattern, "Some text A 8:00-19:00 Some text B", $matches);
    
        print_r($matches);
    
    这适用于我
    /^(.*)(\d{1,2}:\d{2}-\d{1,2}:\d{2})?(.*)$/

    <?
    
    $str = "Some text A 8:00-19:00 Some text B";
    $pat = "/^(.*) ?(\d{1,2}:\d{2}-\d{1,2}:\d{2}) ?(.*)$/";
    
    if(preg_match($pat, $str, $matches)){
       /*
    
        Cases 2, 3 and 4
    
        Array
        (
            [0] => Some text A 8:00-19:00 Some text B
            [1] => Some text A 
            [2] => 8:00-19:00
            [3] => Some text B
        )
    
       */
    }else{
       /* Case 1 */
    }
    
    ?>
    

    好的。。。我不清楚到底是什么情况

    我相信您希望匹配3个可选组(可能会匹配“格式错误”的输入,除非您提供了不希望匹配的案例场景)

    尽管在案例1中,$matches[0]和$matches[3]中出现了“Some text A”,而不是$matches[1],但这在所有示例中都有效

    /^([A-Za-z ]*?)([0-2]{0,1}[0-9]\:[0-6][0-9]\-[0-2]{0,1}[0-9]\:[0-6][0-9])?([A-Za-z ]*?)$/
    
    使用如何

    输出:

    Array
    (
        [0] => Some text A
    )
    Array
    (
        [0] => Some text A 
        [1] => 8:00-19:00
    )
    Array
    (
        [0] => 8:00-19:00
    )
    Array
    (
        [0] => Some text A 
        [1] => 8:00-19:00
        [2] =>  Some text B
    )
    


    我知道我应该使用
    \d{1,2}:\d{1,2}-\d{1,2}:\d{1,2}
    ,但我很懒,想把模式缩短一些:ddos与
    某些文本A
    (示例1)不匹配,或者是这样吗?没有测试,谢谢你。正如Kaii所说,它与示例2、3和4匹配,但与示例1不匹配。我试图添加一个
    四元数,但是没有任何匹配项了……当然,您也可以轻松地将这个角落的情况作为正则表达式的一部分来处理;-)+1嗯,这适用于非重音字符。我是法国人,我刚用c-cedilla(
    ç
    )…:-)测试过。我不明白为什么正则表达式引擎不能将
    某些文本B
    (.*)
    匹配到模式的末尾。有人能解释一下原因吗?没有将匹配分为1-3组,只给出完整的匹配行,这不是OP想要的。这适用于案例2、3和4。但不是第一个:)如果不匹配,请抓取整个输入,对不起,我完全忘了测试第一个案例。正如@robinr所说的,如果没有匹配项,那么您只需抓住整个字符串(我编辑了这个)。诚然,发布的纯正则表达式解决方案比这个要好。在您给出的这四个示例中,您需要捕获它们吗?或者仅仅是那些有日期时间的?这“一些文本a”和“一些文本B”是一些必须精确的值,或者它可能会变化?我的意思是,如果你只需要在有特定值时匹配,或者如果它必须在时间前后匹配任何值。Tivi:是的,我需要捕获所有这些值,即使是那些没有时间的(在本例中,将捕获整行内容)。rcdmk:时间前后的文本可能会有所不同。我需要在有时间时捕获它们(或不,正如Tivie所说)。可能正则表达式不是用于此作业的正确工具。这适用于给定的示例输入,但在时间前后的文本包含小数时不起作用。。(例如,
    在9:00-11:00的某个地方遇见3个人
    )你没有指定文本也有数字…所以你的文本可以有任何类型的字符?!所有的字符?像#&´´´~@等等?不,OP没有-我只是想添加它作为你的正则表达式的备注/限制。谢谢你的回答。我接受了Gordon的答案,因为它在我现有的代码中更合适。你的答案也可以适用:)
    Array
    (
        [0] => Some text A
    )
    Array
    (
        [0] => Some text A 
        [1] => 8:00-19:00
    )
    Array
    (
        [0] => 8:00-19:00
    )
    Array
    (
        [0] => Some text A 
        [1] => 8:00-19:00
        [2] =>  Some text B
    )