2012-02-19 24 views
21

一般的に言えば、そこに含まれている場合にのみ、文字列中の一部の部分文字列を探したいと思います。Regex文字列内の単語を検索

私が表現持っていた:

high pass h3 

私は表現を経由して文字列をテストするとき、私は文字列全体が発見されたことがわかります(ただしグループではない「合格」):

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

そして、テスト文字列を

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

しかし、私には2つのグループがあります: 1:ハイパスh3 2:

を渡し、私がテストしたときに、例えば、文字列 - 高h3が、私はまだ1グループが見つかりました - 高H3

私はこれをどのように行うことができます

+1

1.どのようなプラットフォーム(すべての正規表現の実装が同じではない):PerlやPython、Javaや.NET、...? 2.「そこに含まれている場合のみ」は明確ではない。 – Richard

+1

なぜ文字列全体を一致させたいのですか? – Mat

+0

それは複数の行で、見つかる単語を含む完全な行を得ることができます。 – Mario

答えて

5

ちょうどそれが動作するためにちょっと欠けています(プラス?は間違った位置にあります)。

フリーリスト出現と一致させたい場合:^(.*?)(\bpass\b)(.*)$。 最後に出現したものと一致させたい場合:^(.*)(\bpass\b)(.*?)$

これは3つのキャプチャグループになります:前のすべて、完全一致、それに続くすべて。

.は(ほとんどの設定に応じて)何かが1つの文字に一致します。 ?は、先行要素をオプションにします。つまり、まったくまたは正確に1回ではありません。 *は、前の要素を複数回、つまりまったくまたは無制限に一致させます。これはできるだけ多くの文字と一致します。 両方を組み合わせて*?にすると、可能な限り少ない文字数(0まで)で本質的に一致する一致しない一致が得られます。

編集: 私はあなただけpassたい読み、完全な文字列は、実装/言語に応じて、次は十分なはずのよう:^.*(\bpass\b).*?$(再び、ungreedy試合は貪欲なものと交換することがあります)。あなたは全体の表現/マッチをグループ0として取得し、最初に定義したマッチをグループ1として取得します。

+0

残念ながら、このソリューションはC#regex、string - "high h3"では全く動作しませんでしたが、文字列が一致しない場合は文字列全体を一致結果として返す必要があります。私が必要としたのは、これが私の正規表現の唯一の部分であり、 "パス"が見つからなくても動作するはずのseacrhのための別のパターンがあるからです。 – baio

+0

ああ? 「パス」はオプションである必要がありますか? '|'を使って代替配列を定義することを考えましたか?例えば。 '^。*?(\ b(?:passed | failed)\ b)。*?$'のようなものは両方の選択肢にマッチします。それはあなたが渡すかもしれないことを考慮して、なぜあなたは全体の行に一致する必要がありますか? '?'をつけることで任意のシーケンスを任意にすることができますが、あなたの "キーワード"を含む可能性のあるワイルドカードマッチを使用すると予期しない結果になるかもしれません。 – Mario

3

あなたは

^.(\bpass\b)?.$ 

マッチングされているので、期間のみ、単一の文字に一致します

  • 入力
  • のスタート一文字
  • オプション
    • Wordを境界
    • は、入力
    • 私はすべての "ハイパスH3" を一致させるために期待していない

  • ワード境界
  • シングル文字
  • 終了 "を渡します"。

    正規表現:

    pass 
    

    (なしメタキャラクタ)が「合格」を含む任意の文字列に一致します(ただし、そのように機能「文字列内の文字列を検索する」だろうが、これはおそらく、複雑させずに速くなります正規表現の)。

  • 43

    は、このいずれかを使用します。

    ^(.*?(\bpass\b)[^$]*)$ 
    
    1. ライン全体のための最初のキャプチャを。
    2. 予想される単語の2番目のキャプチャ。

    demoを確認してください。

    詳細な説明:

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

    Thansks!しかし、問題は、 "合格"がテストされた文字列に含まれていなくても、一致(全文)が見つかるということです。デモをご覧ください。出来ますか? – baio

    +0

    これをチェックしてください:http://www.myregextester.com/?r=aa94f52d '^(。*?(bpass \ b)[^ $] * | [^ $] *)$' – piouPiouM

    関連する問題