一般来说,我想在字符串中找到一些子字符串,但只有在那里包含它。
我有表情:
^.*(\bpass\b)?.*$
测试字符串:
high pass h3
当我通过表达式测试字符串时,我看到找到整个字符串(但不是“传递”组):
match : true
groups count : 1
group : high pass h3
但我需要的是,那场比赛有两组: 1:高通h3 2:通过
当我测试时,例如,字符串 - 高h3,我仍然找到1组 - 高h3
我该怎么做?
答案 0 :(得分:60)
使用这个:
^(.*?(\bpass\b)[^$]*)$
检查demo。
更多解释:
┌ first capture
|
⧽------------------⧼
^(.*?(\bpass\b)[^$]*)$
⧽-⧼ ⧽---⧼
| ⧽--------⧼ |
| | └ all characters who are not the end of the string
| |
| └ second capture
|
└ optional begin characters
答案 1 :(得分:6)
你只是错过了一点工作(加上?
处于错误的位置)。
如果你想匹配第一次出现:^(.*?)(\bpass\b)(.*)$
。
如果您想匹配最后一次出现:^(.*)(\bpass\b)(.*?)$
。
这将产生3个捕获组:之前的所有内容,完全匹配以及随后的所有内容。
.
将匹配(几乎取决于您的设置)任何内容,但只匹配一个字符。
?
将使前面的元素成为可选的,即根本不显示或仅显示一次。
*
将多次匹配前一个元素,即根本不匹配或无限次。这将匹配尽可能多的字符。
如果将两者结合到*?
,您将得到一个不合适的匹配,基本上匹配尽可能少的字符(低至0)。
编辑:
在我阅读时,您只需要pass
和完整的字符串,具体取决于您的实现/语言,以下内容应该足够了:^.*(\bpass\b).*?$
(同样,不合适的匹配可能会与贪婪的匹配交换)。您将整个表达式/匹配作为组0,并将第一个定义的匹配作为组1。
答案 2 :(得分:3)
句点只匹配一个字符,所以你是
^.(\bpass\b)?.$
匹配:
我根本不希望与“高通h3”相匹配。
正则表达式:
pass
(没有元字符)将匹配任何包含“pass”的字符串(但那么“在字符串中查找字符串”函数也是如此,如果没有正则表达式的复杂性,这可能会更快。)