2012-02-19 76 views
21

一般而言,我想在字符串中找到一些子字符串,但前提是它包含在字符串中。正则表达式在字符串中找到字

我不得不表达:

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

和测试字符串:

high pass h3 

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

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

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

当我测试,例如,串 - 高H3,我仍然有1组发现 - 高H3

我怎样才能做到这一点?

+1

1.什么平台(不是所有的正则表达式的实现都一样):Perl,Python和Java的,.NET,...? 2.“只有当它被包含在内”才不清楚。 – Richard 2012-02-19 10:14:53

+1

为什么你想要整个字符串作为匹配? – Mat 2012-02-19 10:15:02

+0

它可能是多行,为他提供完整的行,包括要找到的单词。 – Mario 2012-02-19 10:20:14

回答

5

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

如果您想匹配第一次出现:^(.*?)(\bpass\b)(.*)$。 如果你想匹配上次发生:^(.*)(\bpass\b)(.*?)$

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

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

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

+0

不幸的是,这个解决方案在C#regex,string - “high h3”中根本找不到,但我期望如果找不到匹配的字符串应该返回整个字符串作为匹配结果。为什么我需要的是因为这是我的正则表达式的唯一部分,并且还有另一种海葵模式,即使没有找到“通过”也应该起作用。 – baio 2012-02-19 11:34:59

+0

啊? “通”应该是可选的?您是否想过使用'|'定义替代序列?例如。类似'^。*?(\ b(?:传递|失败)\ b)。*?$'将匹配两个选项。为什么你甚至不得不匹配整条线,考虑到你可能会传递什么?您可以通过添加'?'来使任何序列可选,但是当使用可能包含“关键字”的通配符匹配时,这可能会有意想不到的结果。 – Mario 2012-02-20 11:00:24

3

一个时期只匹配单个字符,所以你

^.(\bpass\b)?.$ 

是匹配:

  • 开始输入
  • 单个字符
  • 可选
    • 的Word边界
    • “通行证”
    • 字边界
  • 单个字符
  • 输入

,我不希望在所有符合 “高通H3” 的结束。

正则表达式:

pass 

(无元字符)将匹配任何字符串包含“合格”(但那么将是“发现串串”的功能,而这可能会更快,而不复杂正则表达式)。

43

使用这一个:

^(.*?(\bpass\b)[^$]*)$ 
  1. 首先捕获整条生产线。
  2. 预期单词的第二次捕获。

检查demo

更多的解释:

  ┌ first capture 
      | 
⧽------------------⧼ 
^(.*?(\bpass\b)[^$]*)$ 
    ⧽-⧼   ⧽---⧼ 
    | ⧽--------⧼ | 
    |  |  └ all characters who are not the end of the string 
    |  | 
    |  └ second capture 
    | 
    └ optional begin characters 
+0

Thansks!但问题是我所需要的是,即使“pass”不在测试字符串中,也会找到匹配(全文),请参阅您的演示。可能吗? – baio 2012-02-19 19:00:03

+0

检查这一个:http://www.myregextester.com/?r=aa94f52d'^(。*?(\ bpass \ b)[^ $] * | [^ $] *)$' – piouPiouM 2012-02-19 19:21:33

相关问题