"热键字符串"

时间:2016-10-30 18:43:50

标签: javascript regex

我们需要在 Javascript 的字符串中找到搜索"热键" 的表达式。 该选项几乎可以找到除序列之外的所有内容:Ctrl + M, K, o, i。正如他发现...我们绝对不需要的那样:)

修改

(?=((ctrl|alt|shift|,|\.|\/)+?\s*[+\-/]\s*(((numpad\s*[\w/\*\-\+\.]+)|(ctrl|alt|shift|,|\.|\/|[a-z]+)+?,?)\s*(?=((([a-z],)\s*[a-z])\s*,?\s*)?)\1(?=([a-z])?)\1)))\1

测试多字符串变体,不区分大小写

<p>Ctrl + Insert, K</p>
<ul>Ctrl +,</ul>'
list Ctrl + , of end
colomn Ctrl + .</>'
<q>Ctrl + M</q>'
<a>Ctrl + M, K, o, i</a>
row Ctrl + M, , + P. While...
<rom>Ctrl + M, K, p</rom>'
<tag>Ctrl + M, Shift + O</tag>'
press Ctrl + M, Shift + O, , + P! Thanks.
Stop. Ctrl + M, Shift + O, / + P</end>
<anytag>Ctrl + Numpad +/-</anytag>'

我哪里错了?

*抱歉,由于声誉不足,我无法插入预览

1 个答案:

答案 0 :(得分:2)

在小组(ctrl|alt|shift|,|\.|\/)+?中,它会抓取. 在角色类中,您尚未转义-,因此[+-/]确实充当了+(43)和/的ascii值之间的#34;字符(47),即+,-./。 在|之前的最后一组中,您还允许其捕获第三个.。 因此可以捕获...,您可以通过-转义[+\-/]来避免这种情况。

以下是我认为可能适合您的版本:

(ctrl|shift|alt)\s*\+\s*([a-z+\-.,/]|Numpad\s*[0-9+\-/]+|insert)(\s*(,|\+)\s*((ctrl|shift|alt)\s*\+\s*)*([a-z+\-.,/]|Numpad\s*[0-9+\-/]+|insert))*(?=\W)

我正在使用https://regex101.com/来实时查看匹配项。

  1. 我首先想到它应该捕获单位(a-z,.+-/)所以我现在有[a-z+\-.,/](为了避免混淆,我没有直接使用[+-/]
  2. 然后,我们不应该抓取Ctrl或任何单词作为分开的匹配。所以我添加了一个积极的lookbehind [a-z+\-.,/](?=\W)
  3. 它应该以修饰键(Ctrl,Alt,Shift)作为序列开始 - 否则它可以捕获正常的英语单词,如I(ctrl|shift|alt)\s*\+\s*[a-z+\-.,/](?=\W)
  4. 突然,Numpad 0-9+-/ (ctrl|shift|alt)\s*\+\s*([a-z+\-.,/]|Numpad\s*[0-9+\-/]+)(?=\W)也应该是单位,让我们将第1步中的角色类分组,用于捕获单位:Insert
  5. 我还将(ctrl|shift|alt)\s*\+\s*([a-z+\-.,/]|Numpad\s*[0-9+\-/]+|insert)(?=\W)添加为可捕捉单位之一:,(units)
  6. 最后,让我们添加在第一个捕获的热键(修饰符+单位)之后捕获(ctrl|shift|alt)\s*\+\s*([a-z+\-.,/]|Numpad\s*[0-9+\-/]+|insert)()*(?=\W)的重复组:()*。是的,添加空白, with units以确保正则表达式仍然是平衡的并且适用于旧匹配。
  7. 我们将第2组放入空括号中,因此它按照我们的想法运作:(ctrl|shift|alt)\s*\+\s*([a-z+\-.,/]|Numpad\s*[0-9+\-/]+|insert)(\s*,\s*([a-z+\-.,/]|Numpad\s*[0-9+\-/]+|insert))*(?=\W), + P
  8. 我们无法捕获的唯一内容是/ + Punit + unit,因为我们还没有捕获+个群组!我们可能会重复多次......最简单,最懒惰的方式 - 将,也作为分隔符(与(ctrl|shift|alt)\s*\+\s*([a-z+\-.,/]|Numpad\s*[0-9+\-/]+|insert)(\s*(,|\+)\s*([a-z+\-.,/]|Numpad\s*[0-9+\-/]+|insert))*(?=\W)相同):Ctrl + M, Shift + O, / + P
  9. 了解上述内容,我们希望捕获(ctrl|shift|alt)\s*\+\s*([a-z+\-.,/]|Numpad\s*[0-9+\-/]+|insert)(\s*(,|\+)\s*((ctrl|shift|alt)\s*\+\s*)*([a-z+\-.,/]|Numpad\s*[0-9+\-/]+|insert))*(?=\W) - 这意味着,我们还应在单元前面添加可选修饰符:<TabControl x:Name="messageTabControl"> <TabControl.ContentTemplate> <DataTemplate> <ScrollViewer Name="Scroll" CanContentScroll="True"> <TextBlock Name="messageTabTextBlock" Text="test"/> </ScrollViewer> </DataTemplate> </TabControl.ContentTemplate> </TabControl>