与正则表达式匹配一次

时间:2013-12-06 13:33:23

标签: php regex

我正在使用这个正则表达式来加工一些没有数字的单词并且效果很好

(?:searchForThis|\G).+?(\b[^\d\s]+?\b)

正则表达式搜索整个文档而不仅仅是在包含searchForThis

的行中的问题

因此,如果我有2次搜索,那么它将需要两次

我想只停留在第一行,所以它不会搜索其他行 有什么帮助吗?

我正在使用带有php的正则表达式

问题示例:http://www.rubular.com/r/vPhk8VbqZR

在示例中,您将看到:

Match 1
1.  word
Match 2
1.  worldtwo
Match 3
1.  wordfive
Match 4
1.  word
Match 5
1.  worldtwo
Match 6
1.  wordfive

但我只需要:

Match 1
1.  word
Match 2
1.  worldtwo
Match 3
1.  wordfive

你会看到它正在做两次

===========编辑以了解更多详情===========================

在我的php中我有:

define('CODE_REGEX', '/(?:searchForThis|\G(?<!^)).*?(\b[a-zA-Z]+\b)/iu')

输出:

if (preg_match_all(CODE_REGEX, $content, $result))
            return trim($result[1][0].' '.$result[1][1].' '.$result[1][2].' '.$result[1][3].' '.$result[1][4].' '.$result[1][5]);

谢谢

2 个答案:

答案 0 :(得分:3)

您可以改用此模式:

(?:\A[\s\S]*?searchForThis|\G).*?(\b[a-z]+\b)/iu

(?:\A(?s).*?searchForThis|\G)(?-s).*?(\b[a-z]+\b)/iu

要处理第一个“searchForThis”与其他字符串或字符串结尾之间的多行,您可以使用:(使用您的示例字符串,您将获得“After”和“this”。)

(?:\A.*?searchForThis|\G)(?>[^a-z]++|\b[a-z]++\S)*?(?!searchForThis)(\b[a-z]+\b)/ius

注意:在所有三种模式中,您可以将\A替换为^,因为未使用多线模式。小心设计用于ruby正则表达式的rubular:m in ruby​​ = s在php中(即dotall / singleline模式),php中的m是多行模式(行的每个开头都可以与^匹配)

答案 1 :(得分:0)

你可以分两个阶段进行:

// get the first line with 'searchForThis'
preg_match('/searchForThis(?<line>.*)\n/m', $text, $results);
$line = $results['line'];

// get every word from this line
preg_match_all('/\b[a-z]+\b/i', $line, $results);
$words = $results[0];

另一种方式,基于伟大的卡西米尔的答案(仅为了可读性):

preg_match_all('/(?s:^.*?searchForThis|\G).*?(?<words>\b[a-z]+\b)/iu', $str, $results);
$words = $results['words'];