正则表达式在字符串中找到单词

时间:2012-02-19 10:11:00

标签: regex

一般来说,我想在字符串中找到一些子字符串,但只有在那里包含它。

我有表情:

^.*(\bpass\b)?.*$

测试字符串:

high pass h3 

当我通过表达式测试字符串时,我看到找到整个字符串(但不是“传递”组):

match : true
groups count : 1  
group : high pass h3 

但我需要的是,那场比赛有两组: 1:高通h3 2:通过

当我测试时,例如,字符串 - 高h3,我仍然找到1组 - 高h3

我该怎么做?

3 个答案:

答案 0 :(得分:60)

使用这个:

^(.*?(\bpass\b)[^$]*)$
  1. 首先捕获整条线。
  2. 第二次捕获预期的单词。
  3. 检查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”的字符串(但那么“在字符串中查找字符串”函数也是如此,如果没有正则表达式的复杂性,这可能会更快。)