2012-02-19 61 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

相關問題