子串的正则表达式匹配由最多N个单词分隔

时间:2014-09-30 15:03:26

标签: regex

我做了大量的谷歌搜索,但我找不到工作表达。我的意思是匹配这个元表达式:

Blah Blah Blah, I'm looking for [max N words] player

换句话说,我需要匹配:

Even these days I'm looking for a couple of players
I'm looking for an experienced player
I'm looking here and there to find a good player  <--- Must not match!
I'm looking for a player

依旧......

正如你所看到的,我不是在计算角色,而是用文字计算。

在我的情况下,

N可能是5。

我不需要返回,只需要检查字符串中是否找到了这个n-gram模式。

修改 编辑了第三行(没有'for'的那一行)以澄清

4 个答案:

答案 0 :(得分:1)

详细信息取决于您使用的正则表达式。对于那些支持它的人,您可以搜索表达式的1-N个实例,使用{1,N}格式。例如,使用此测试文件:

Even these days I'm looking for a couple of players
I'm looking for an experienced player
I'm looking here and there to find a good player
I'm looking for a player
I'm looking for too many words here, it should not match player

使用GNU grep来说明,最大数量为3:

  1. 基本正则表达式(BRE)
  2.     $ grep -o "I'm looking for \([^[:blank:]]* \)\{1,3\}players*" file 
        I'm looking for a couple of players
        I'm looking for an experienced player
        I'm looking for a player
    
    1. 扩展正则表达式(ERE):
    2.    
       $ grep -oE "I'm looking for ([^\s]* ){1,3}players*" file 
       I'm looking for a couple of players
       I'm looking for an experienced player
       I'm looking for a player
      

答案 1 :(得分:0)

这是你正在寻找的东西吗?

.*(I'm looking for) (.*) (player{1}s?)

http://regex101.com/r/zT0qR4/1

我在某些方面看到你有玩家和其他玩家,而且正如阿维纳什所说,你是否也希望匹配3号线?

您可以在捕获组$ 2中捕获您要查找的单词。或者你可以将?=添加到其他组以使它们不被捕获。

答案 2 :(得分:0)

如果你想捕获其中的内容,你可以使用这样的正则表达式:

(?<=looking for)(.*)(?=player)

<强> Working demo

enter image description here

匹配内容将是:

MATCH 1
1.  [31-44] ` a couple of `
MATCH 2
1.  [67-83] ` an experienced `
MATCH 3
1.  [154-157]   ` a `

顺便说一句,如果你不想使用外观,你可以简单地使用:

looking for(.*)player

另一方面,由于示例3包含here以上正则表达式将不匹配,因此如果您也想包含它,则可以使用此正则表达式:

looking (?:for|here)(.*)player

答案 3 :(得分:0)

我会这样做:

(?<=looking for)(?:\s+\S+){1,5}\s+(?=\player)

(?:\s+\S+){1,5}匹配一个或多个空格后跟一个或多个非空格,重复一到五次。