正则表达式匹配所需单词列表中单词的第一次出现
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
)?
我似乎遇到了一个极端情况——或者说它很简单,从来没有人问过!
我有一个想要在文本块中匹配的单词列表。但是,我只想匹配第一次出现的 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]|$), 在一个文本块中。
非常感谢!
乱序匹配
(更多高级乱序匹配见:
这可以在一场比赛中轻松完成。
如果要匹配的单词数量较少且固定,则可以这样做。
这需要所有的单词都在那里。
(稍微修改一下,每个单词都可以是可选的)
^(?=.*?(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
)?