【问题标题】:Regular Expression That Contains At Least One Of Each至少包含一个的正则表达式
【发布时间】:2019-03-24 01:52:54
【问题描述】:

我正在尝试将至少包含一个数字、字母和特殊字符(如句点或破折号)的“单词”大写。

例如:3370.01b6510.01.bm-5510.30drm-2013-c-004914

我不希望它匹配以下内容:hellosk8mixed-up

我正在尝试使用前瞻,as suggested,但我无法让它匹配任何东西。

$output = preg_replace_callback('/\b(?=.*[0-9]+)(?=.*[a-z]+)(?=.*[\.-]+)\b/i', function($matches){return strtoupper($matches[0]);}, $input);

【问题讨论】:

    标签: php regex


    【解决方案1】:

    你可以使用这个正则表达式来匹配你想要的字符串,

    (?=\S*[a-z])(?=\S*\d)[a-z\d]+(?:[.-][a-z\d]+)+
    

    说明:

    • (?=\S*[a-z]) - 这种前瞻确保传入的单词中至少有一个字母字符
    • (?=\S*\d) - 这种前瞻确保传入的单词中至少有一个数字
    • [a-z\d]+(?:[.-][a-z\d]+)+ - 此部分捕获包含字母数字单词的单词,其中至少包含一个特殊字符 .-

    Online Demo

    这是修改代码的 PHP 代码演示,

    $input = '3370.01b, 6510.01.b, m-5510.30, and drm-2013-c-004914 hello, sk8, and mixed-up';
    $output = preg_replace_callback('/(?=\S*[a-z])(?=\S*\d)[a-z\d]+(?:[.-][a-z\d]+)+/i', function($matches){return strtoupper($matches[0]);}, $input);
    echo $output;
    

    打印,

    3370.01B, 6510.01.B, M-5510.30, and DRM-2013-C-004914 hello, sk8, and mixed-up
    

    【讨论】:

      【解决方案2】:

      正则表达式:

      https://regex101.com/r/sdmlL8/1

      (?=.*\d)(.*)([-.])(.*)
      

      PHP 代码:

      https://ideone.com/qEBZQc

      $input = '3370.01b';
      $output = preg_replace_callback('/(?=.*\d)(.*)([-.])(.*)/i', function($matches){return strtoupper($matches[0]);}, $input);
      

      【讨论】:

      • 根据 OP,如果单词只包含数字,它不应该匹配,它也应该包含一个字母。
      【解决方案3】:

      我认为你从来没有捕捉到任何东西可以放入比赛中......

      $input = '3370.01b foo';
      $output = preg_replace_callback('/(?=.*[0-9])(?=.*[a-z])(\w+(?:[-.]\w+)+)/i', function($matches){return strtoupper($matches[0]);}, $input);
      
      echo $output;
      

      输出

      3370.01B foo
      

      Sandbox

      https://regex101.com/r/syJWMN/1

      【讨论】:

      • 您的解决方案还匹配 aaa-ddd 111-222 字符串,根据 OP 不应匹配,因为单词中应至少包含一个数字和一个字母。 Check this
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-06-24
      • 1970-01-01
      • 1970-01-01
      • 2022-12-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多