代码之家  ›  专栏  ›  技术社区  ›  Brennan Vincent

绝对初学者正则表达式问题

  •  0
  • Brennan Vincent  · 技术社区  · 14 年前

    我使用的是php 5的preg函数,如果有什么区别的话。

    考虑与以下正则表达式匹配的正则语言。

    ([^{}] | {[0-9a-zA-Z_]+})*
    

    该语言由任意数量的字符组成的字符串组成,带有特殊的嵌入标记,用左括号和右括号标记,其中包含一个或多个字母数字或下划线字符的字符串。例如,以下是语言中的有效字符串:

    asdf asdf 1243$*a asdf?{432 U}

    但是,在用这个regex验证一个字符串时,我想得到这些用大括号分隔的标记及其在字符串中的位置的列表。考虑到前面的示例字符串,我希望有一个数组告诉我:

    A_123: 20; 432U: 32
    

    正则表达式是否可以这样做?或者,我应该“手工”编写一个不带regexp的函数,它遍历字符串的每个字符并解析出我需要的数据吗?

    如果这是一个基本问题,请原谅我;我只是在学习!

    1 回复  |  直到 14 年前
        1
  •  2
  •   NullUserException Mark Roddy    14 年前

    要捕获偏移,可以设置 PREG_OFFSET_CAPTURE 旗帜。 http://php.net/manual/en/function.preg-match.php

    preg_match ($regex, $subject, $matches, PREG_OFFSET_CAPTURE);
    

    您可以自己运行以下脚本并查看结果:

    $regex = '~({(\w+)})+~';
    $str = 'asdfasdf 1243#$*#{A_123}asdf?{432U}';
    
    preg_match_all($regex, $str, $m, PREG_OFFSET_CAPTURE);
    $tags = $m[1];
    
    echo '<pre>';
    print_r($tags); // prints tags and their offsets
    echo '</pre>';
    

    关于模式:

    • \w 是等同于以下字符类的转义序列: [a-zA-Z0-9_]
    • 圆括号 (...) 用于分组,它们还创建backreference。
    • 这个 + 是表示前一个模式的“一个或多个”的量词

    关于regex的一个好资源: http://www.regular-expressions.info