【问题标题】:Unexpected Regexp result with *带有 * 的意外正则表达式结果
【发布时间】:2014-07-17 14:58:11
【问题描述】:

我正在尝试设计一个正则表达式来提取:

aa
bb
cc

来自主题:

aa,bb,cc

我正在使用以下正则表达式:

|(.+?),*|

但结果是

a
a
b
b
c
c

请帮忙,

谢谢。

【问题讨论】:

  • 如果它是一个简单的逗号分隔列表那么为什么不使用explode() 即$result = explode(",",$text);
  • 因为实际的主题是这样一个prolog生成的列表:[1-[],2-[3-a,4-b,5-a,7-b,8-d ,9-e,10-f,11-g,12-h,13-i,14-l,15-a,16-m],3-[]]
  • 字符串必须重复还是可以是字母数字字符?
  • 鉴于您的回答(与您最初的问题不符) - 您究竟希望从数据中得到什么?

标签: php regex preg-match-all


【解决方案1】:

从索引 1 中获取匹配组。

(\w+),?

DEMO

示例代码:

$re = "/(\\w+),?/m";
$str = "aa,bb,cc";

preg_match_all($re, $str, $matches);

您可以使用PHP: Split string 也可以使用explode

$myArray = explode(',', $myString);

阅读更多How can I split a comma delimited string into an array in PHP?

【讨论】:

    【解决方案2】:

    ? 使您的匹配“非贪婪”,这意味着它将匹配满足正则表达式的最短可能字符串。另外,,* 表示0 or more commas

    您正在寻找的是:

    |[^,]+|
    

    例如:

    <?php
    $foo = "aa,bb,cc";
    preg_match_all("/[^,]+/",$foo,$matches);
    for($j=0;$j<count($matches[0]); $j++){
      print $matches[0][$j] .  "\n";
    }
    ?>
    

    【讨论】:

      【解决方案3】:

      没有任何组,

      (?<=^|,)\w+
      

      \w+(?=,|$)
      

      DEMO

      PHP 代码是,

      <?php
      $data = "aa,bb,cc";
      $regex =  '~(?<=^|,)\w+~';
      preg_match_all($regex, $data, $matches);
      var_dump($matches);
      ?>
      

      输出:

      array(1) {
        [0]=>
        array(3) {
          [0]=>
          string(2) "aa"
          [1]=>
          string(2) "bb"
          [2]=>
          string(2) "cc"
        }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-08-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-01-22
        • 1970-01-01
        • 2015-02-06
        相关资源
        最近更新 更多