RegEx匹配单词的首次出现,来自所需单词的列表

时间:2017-03-21 18:40:03

标签: regex regex-group

我似乎碰到了一个角落的情况 - 或者它很容易,没有人问过!

我有一个我希望在一个文本块中匹配的所需单词列表。但是,我只想匹配第一次出现的每个,(编辑:如果它们存在于目标块中)。

如果我的文本块显示:

glass shoes door doors window door glasses. glass's glass window windows glasses

我想匹配:

glass door window

我在学习如何理解分组时学习如何缩小范围...这:

/(?:[\ s]的| ^)门|玻璃|窗口(?= [\ s]的| $)/克;

给了我"鬼"出现:

glass, door, door,window, door,glass,glass,glass,window,glass

将我想要的单词括在括号中作为一组(组?),如下所示:

/(?:[\s]|^)(door|glass|window)(?=[\s]|$)/g;

只给出了每一次实际发生的事情:

glass, door, window, door, glass, window

这是迄今为止我能得到的最好(最窄)。

我原以为:

/(door|glass|window)/

没有/ g全局标志会给我第一次出现" my"或者"期望"或者"单词",但它在第一次找到时停止,"玻璃"。

所以要重申这个问题,(已编辑)我试图找到这些词的每个的第一个实例(第一个门,第一个窗口,和第一个玻璃), if 它们完全出现,由(?:[\ s] | ^)和(?= [\ s] | $)包裹在一个文本块中。< / p>

非常感谢!

1 个答案:

答案 0 :(得分:0)

无序匹配
(有关更多高级乱序匹配,请参阅:
thisthis

这可以在一场比赛中轻松完成 如果你有一个小的,固定数量的单词匹配,你可以这样做。

这要求所有的话都在那里 (稍作修改,每个单词都可以选择)

^(?=.*?(door))(?=.*?(glass))(?=.*?(window))

扩展

 ^
 (?=
      .*? 
      ( door )                      # (1)
 )
 (?=
      .*? 
      ( glass )                     # (2)
 )
 (?=
      .*? 
      ( window )                    # (3)
 )

输出

 **  Grp 0 -  ( pos 0 , len 0 )  EMPTY 
 **  Grp 1 -  ( pos 12 , len 4 ) 
door  
 **  Grp 2 -  ( pos 0 , len 5 ) 
glass  
 **  Grp 3 -  ( pos 23 , len 6 ) 
window  

其他 - 将项目设为可选

使项目可选的调整:

^(?=.*?(?:door|window|glass))(?=.*?(door))?(?=.*?(glass))?(?=.*?(window))?

扩展

 ^ 
 (?=                   # Prevent matching nothing.
      .*? 
      (?: door | window | glass )  # At least one should exist
 )
 (?=
      .*? 
      ( door )              # (1), Optiional first door
 )?
 (?=
      .*? 
      ( glass )             # (2), Optiional first glass
 )?
 (?=
      .*? 
      ( window )            # (3), Optiional first window
 )?