正则表达式匹配所需单词列表中单词的第一次出现

RegEx match the first occurance of a word, from a list of desired words

我似乎遇到了一个极端情况——或者说它很简单,从来没有人问过!

我有一个想要在文本块中匹配的单词列表。但是,我只想匹配第一次出现的 each,(编辑:if 它们存在于目标块中)。

如果我的文本块显示为:

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

我想配:

glass door window

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

/(?:[\s]|^)门|玻璃|window(?=[\s]|$)/g;

出现 "ghost" 次:

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" 或 "desired" 或 "words",但它会在第一个找到时停止,"glass"。

所以要重申这个问题,(已编辑) 我试图找到这些词的 each 的第一个实例(第一个门,第一个 window,第一个玻璃杯),if 它们出现了,被 (?:[\s]|^) 和 (?=[\ s]|$), 在一个文本块中。

非常感谢!

乱序匹配
(更多高级乱序匹配见:
this )

这可以在一场比赛中轻松完成。
如果要匹配的单词数量较少且固定,则可以这样做。

这需要所有的单词都在那里。
(稍微修改一下,每个单词都可以是可选的)

^(?=.*?(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
 )?