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

bai*_*aio 31 regex

一般来说,我想在字符串中找到一些子字符串,但前提是它包含在那里.

我有表情:

^.*(\bpass\b)?.*$
Run Code Online (Sandbox Code Playgroud)

并测试字符串:

high pass h3 
Run Code Online (Sandbox Code Playgroud)

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

match : true
groups count : 1  
group : high pass h3 
Run Code Online (Sandbox Code Playgroud)

但我需要的是,这场比赛有两组:1:高传h3 2:传球

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

我怎样才能做到这一点?

pio*_*ouM 64

使用这个:

^(.*?(\bpass\b)[^$]*)$
Run Code Online (Sandbox Code Playgroud)
  1. 首先捕获整条线.
  2. 第二次捕获预期的单词.

检查演示.

更多解释:

          ? first capture
          |
 ?------------------?
^(.*?(\bpass\b)[^$]*)$
  ?-?          ?---?
   | ?--------?  |
   |     |       ? all characters who are not the end of the string
   |     |
   |     ? second capture
   |
   ? optional begin characters
Run Code Online (Sandbox Code Playgroud)


Mar*_*rio 6

你只是缺少一点工作(加上?错误的位置).

如果你想匹配frist发生:^(.*?)(\bpass\b)(.*)$.如果你想匹配最后一次出现:^(.*)(\bpass\b)(.*?)$.

这将导致3个捕获组:之前的所有内容,完全匹配以及随后的所有内容.

.将匹配(几乎取决于您的设置)任何东西,但只有一个字符. ?将使前面的元素可选,即根本不显示或仅显示一次. *将多次匹配前面的元素,即根本不匹配或无限次.这将匹配尽可能多的字符.如果你将两者结合起来*?就会得到一个不合适的匹配,基本上匹配尽可能少的字符(低至0).

编辑:当我读到你只想要pass和完整的字符串,取决于你的实现/语言,以下应该是足够的:( ^.*(\bpass\b).*?$同样,不合适的匹配可能与贪婪的匹配).您将获得整个表达式/匹配作为组0,并将第一个定义的匹配作为组1.


Ric*_*ard 5

句点仅匹配单个字符,因此您

^.(\bpass\b)?.$
Run Code Online (Sandbox Code Playgroud)

正在匹配:

  • 输入开始
  • 单个字符
  • 可选
    • 字边界
    • “经过”
    • 字边界
  • 单字符
  • 输入结束

我根本不希望与“高通 h3”相匹配。

正则表达式:

pass
Run Code Online (Sandbox Code Playgroud)

(无元字符)将匹配任何包含“pass”的字符串(但“在字符串中查找字符串”函数也会匹配,并且如果没有正则表达式的复杂性,这可能会更快)。