正規表現:その存在しない場合は、オプションとしてグループを扱うが、本だけその前に、前のグループをキャプチャする場合

Cyclotron3x3:

私は、ユーザからの問合せを解析するための正規表現を使用する必要がある要件を持っています。

例えば、ユーザーのクエリ形式などとのリンクを検索でき

link to <keyword> from <person name>
link to <keyword> from <person name> shared <time>

たとえば、

link to connect form from sandeep agarwal => keyword=connect form, person-name=sandeep agarwal
link to sharepoint ppt from mathews => keyword=sharepoint ppt, person-name=mathews 
link to sharepoint design from Gronvik yesterday => keyword=sharepoint design, person-name=Gronvik, time=yesterday

私は上記の予想キャプチャグループの値を記載しています。

私の正規表現:

"(?[] +)から(?[AZ] +)へのリンク(?:共有)(?[AZ] +)"

ここでは上記の3つのクエリへの私の応答があります

Match 1
Full match = link to connect link from sandeep agarwal
Group `keyword` = connect form
Group `name`= sandeep agarwal   

Match 2
Full match = link to sharepoint git from sapna
Group `keyword` = sharepoint ppt
Group `name`= mathews           

Match 3 - **This is where things go wrong**
Full match = link to sharepoint git from sapna grover shared yesterday
Group `keyword` = sharepoint design
Group `name`= Gronvik shared yesterday

前述した第3回受けて、私は取得していますグループ「名前」と「Gronvikは昨日の共有」が、理想的なシナリオは名前= Gronvikと時間=私は後読みする肯定先読みから多くのアプローチを試してみました「昨日」が、ものになるだろうか他のシナリオは、破壊を開始します。

キーワードは、「共有」は、クエリに存在する場合にのみ、時間をキャプチャする必要があります存在毎回ではないかもしれませんが、それが存在する場合(これを除く)の共有まで、私の「名前」グループは、名前をキャプチャする必要があり、グループ「時間」「共有しました」。誰かが正しい方向を指摘することができれば、それは本当に参考になります。

Wiktor第Stribiżav:

あなたは使用することができます

(?i)^Link\s+to\s+(?<keyword>[a-z ]+) from (?<name>.*?)(?:\s+shared\s+(?<time>[a-z]+))?$

参照してください。正規表現のデモを

細部

  • (?i) - 大文字と小文字を区別しないフラグ
  • ^ -文字列の先頭(またはラインあればm複数行オプションがオンになっています)
  • Link to - リテラルテキスト
  • (?<keyword>[a-z ]+) - グループの「キーワード」:1+文字またはスペース
  • from - リテラルテキスト
  • (?<name>.*?) - グループの「名前」:できるだけ少ないとして任意の0+文字、
  • (?:\s+shared\s+(?<time>[a-z]+))? - のオプションのシーケンス
    • \s+ - 1+空白
    • shared - リテラルストリング
    • \s+ - 1+空白
    • (?<time>[a-z]+) - グループ「時間」:1+手紙
  • $ - 文字列/行の末尾。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=29043&siteId=1