2010-08-14 51 views
0

我使用PHP 5的preg函数,如果它有所作为。绝对初学者正则表达式问题

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

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

语言由任意数目的字符,由左,右大括号,其中包含一个或多个字母数字字符串或下划线标记过的特别嵌入式标签的字符串。例如,下面是在语言的有效字符串:

asdfasdf 1243#$ *#{A_123} ASDF {432U}

然而,在验证一个字符串与此正则表达式,我?想要获得这些花括号分隔标签及其在字符串中的位置的列表。考虑到前面的示例字符串,我想有一个数组告诉我:

A_123: 20; 432U: 32 

这是可能的正则表达式吗?或者,我应该只用手写一个函数,而不使用正则表达式来遍历字符串的每个字符并分析出我需要的数据?

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

回答

2

要捕获偏移量,可以设置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_]
  • 圆括号(...)用于分组,它们也创建反向引用。
  • +是一个量词,意思是“一个或多个”以前的模式

对正则表达式一个很好的资源:http://www.regular-expressions.info

+0

其实偏移量是最重要的组成部分。我只需要获取一组花括号分隔的标签。也许我应该重新修改我的问题:我知道如何使用正则表达式来验证给定的字符串是否属于给定的常规语言,但我不知道如何将它们用于其他任何事情(例如,从一些字符串中提取一些子字符串字符串,这是我需要在这里做的) – 2010-08-14 03:37:43

+0

你只需要一个大括号'{}'中的任何内容的列表?查看我的更新回答 – NullUserException 2010-08-14 03:40:37

+0

谢谢! 7654321 – 2010-08-14 04:28:19