我们需要使用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>'
我哪里错了?
*抱歉,由于信誉不足,我无法插入预览
最佳答案
在组 (ctrl|alt|shift|,|\.|\/)+?
中,它捕获一个 。
在字符类中,您没有转义 -
,因此 [+-/]
确实充当“+
的 ascii 值之间的字符( 43) 和/
(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/实时查看比赛。
- 我一开始认为它应该捕获单位 (
a-z,.+-/
),所以我现在有[a-z+\-.,/]
(避免混淆我没有直接使用[+-/]
。 - 然后,我们不应该将
C
、t
、r
、l
或任何单词捕获为分开的比赛。所以我添加了一个正向回顾:[a-z+\-.,/](?=\W)
- 它应该以修饰键(Ctrl、Alt、Shift)作为序列开头 - 否则它可能会捕获正常的英语单词,例如
I
:(ctrl|shift|alt)\s *\+\s*[a-z+\-.,/](?=\W)
- 突然,哦,
Numpad
和0-9+-/
也应该是单位,让我们将步骤 1 中的字符类设为一组,用于捕获单位:(ctrl|shift|alt)\s*\+\s*([a-z+\-.,/]|小键盘\s*[0-9+\-/]+)(?=\W)
- 我还添加了
Insert
作为可捕获单位之一:(ctrl|shift|alt)\s*\+\s*([a-z+\-.,/]|小键盘\s*[0-9+\-/]+|插入)(?=\W)
- 最后,让我们添加一个重复组,用于捕获第一个捕获的热键(修饰符 + 单位)之后出现的
,(units)
:(ctrl|shift|alt)\s*\+\s*([a-z+\-.,/]|小键盘\s*[0-9+\-/]+|插入)()*(?=\W)
。是的,添加一个空白()*
以确保正则表达式仍然平衡并且适用于旧匹配。 - 我们将组 2 放入空括号中,以便它按我们的想法工作:
,带单位
:(ctrl|shift|alt)\s*\+\s*([a -z+\-.,/]|小键盘\s*[0-9+\-/]+|插入)(\s*,\s*([a-z+\-.,/]|小键盘\s* [0-9+\-/]+|插入))*(?=\W)
- 我们唯一无法捕获的是
、+ P
和/+ P
,因为我们还没有捕获unit + unit
组!我们可能会重复多次......最简单和最懒的方法 - 使+
也作为分隔符(与,
相同的级别):(ctrl|shift|alt)\s*\+\s*([a-z+\-.,/]|小键盘\s*[0-9+\-/]+|插入)(\s*(, |\+)\s*([a-z+\-.,/]|小键盘\s*[0-9+\-/]+|插入))*(?=\W)
< - 了解上述内容后,我们希望捕获
Ctrl + M、Shift + O、/+ P
- 这意味着我们还应该在单位前面添加可选修饰符:( ctrl|shift|alt)\s*\+\s*([a-z+\-.,/]|小键盘\s*[0-9+\-/]+|插入)(\s*(,|\+)\s*((ctrl|shift|alt)\s*\+\s*)*([a-z+\-.,/]|小键盘\s*[0-9+\-/]+ |插入))*(?=\W)
关于javascript - "hotkey string"的正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40332358/