用于匹配序列的正则表达式?

时间:2014-08-13 08:56:07

标签: php regex pcre

我的文字包含已知模式中的短语,例如:#%some phrase%#,短语可以是任何内容(显然它不包含模式'%#')。
现在,我想构建一个正则表达式(在php中),它将匹配2个或更多短语的序列(它们之间有或没有空格),所以如果,例如,我的文本是:

#%jjj jjj%#  kkjjkkjj kkjjkkjj  #%kkk kkk%# #%ttt mmm%#

我希望正则表达式匹配:

#%kkk kkk%# #%ttt mmm%#

我试过这个正则表达式:/(?:#%.+?(?!%#).%#\s*){2,}/

但是由于一些奇怪的原因,它匹配整个字符串,并忽略了负面的前瞻。

此外,我的完整任务是匹配一系列短语,它们之间最多包含1个字符(除了空格外)。

如何实施?

测试用例:

文本:

  

#%Prime目标%##%在线资料%#English Deutsch Norsk Svenska Suomi英语AU英语CA#%Home%##%关于我们%##%公平游戏%##%Promotions%#

应匹配:

  
      
  1. #%Prime目标%##%在线资讯%#
  2.   
  3. #%Home%##%关于我们%##%公平竞赛%##%Promotions%#
  4.   

文本:

  

#%Prime目标%#English Deutsch Norsk Svenska Suomi英语AU英语CA#%Home%#| #%关于我们%#| #%公平竞赛%#| #%促销%#

应匹配:

  
      
  1. #%Home%#| #%关于我们%#| #%公平竞赛%#| #%促销%#
  2.   

3 个答案:

答案 0 :(得分:1)

根据您的测试输入我想出了这个正则表达式,简短且仍然有效

/((?:#%[^#]*%#(?:\s.\s|\s)){2,})/g

测试字符串

test 1

#%Prime target%# #%Online stuff%# English Deutsch Norsk Svenska Suomi English AU English CA #%Home%# #%About Us%# #%Fair Play%# #%Promotions%#

test 2

#%Prime target%# English Deutsch Norsk Svenska Suomi English AU English CA #%Home%# | #%About Us%# | #%Fair Play%# | #%Promotions%#

结果

  • 比赛1
    1. [8-42] #%Prime target%# #%Online stuff%#
  • 比赛2
    1. [100-151] #%Home%# #%About Us%# #%Fair Play%# #%Promotions%#
  • 比赛3
    1. [236-293] #%Home%# | #%About Us%# | #%Fair Play%# | #%Promotions%#

尝试演示here

答案 1 :(得分:1)

您必须修改正则表达式:

(?:#%(?:(?!%#).)+?.%#\s*)(?:.?\s*#%(?:(?!%#).)+?.%#\s*)+

.+?捕获包裹在(?: )组的后备内容中,强制延迟匹配与(?!%#)不匹配,这也是原始正则表达式不起作用的原因。

此外,将其克隆到一个匹配前缀为.?的单独组中,以便在组之间接受字符。

这是regex demo

  

测试用例:

     

#%jjj jjj%# kkjjkkjj kkjjkkjj #%kkk kkk%# #%ttt mmm%#

     

匹配度:
  #%kkk kkk%# #%ttt mmm%#

答案 2 :(得分:0)

我想你想要:

/(?:.*?#%.*?%#.*?)(#%.*%#)/g

首先找到#%...%#(ungreedy)然后匹配下一个#%...%#(贪婪)

<强> Demo