我的文字包含已知模式中的短语,例如:#%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%#
应匹配:
- #%Prime目标%##%在线资讯%#
- #%Home%##%关于我们%##%公平竞赛%##%Promotions%#
醇>
文本:
#%Prime目标%#English Deutsch Norsk Svenska Suomi英语AU英语CA#%Home%#| #%关于我们%#| #%公平竞赛%#| #%促销%#
应匹配:
- #%Home%#| #%关于我们%#| #%公平竞赛%#| #%促销%#
醇>
答案 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%#
结果
#%Prime target%# #%Online stuff%#
#%Home%# #%About Us%# #%Fair Play%# #%Promotions%#
#%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)