我似乎碰到了一个角落的情况 - 或者它很容易,没有人问过!
我有一个我希望在一个文本块中匹配的所需单词列表。但是,我只想匹配第一次出现的每个,(编辑:如果它们存在于目标块中)。
如果我的文本块显示:
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>
非常感谢!
答案 0 :(得分:0)
无序匹配
(有关更多高级乱序匹配,请参阅:
this和
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
)?