28

私は正規表現が初めてで、以下のようなテキストに一致するものを考え出そうとしています:

ABC: (z) 1999 年 1 月 2 日 \n

ノート:

  • テキストは常に「ABC:」で始まります
  • ':' と (z) の間には、ゼロ、1 つ、または複数のスペースがあってもかまいません。
  • (z) のバリエーションも可能 - (zz)、(zzzzzz) など。ただし、常に「()」で囲まれた数字以外の文字
  • (z) と jan の間には、ゼロ、1 つ、または複数のスペースがあってもかまいません。
  • jan は、jan、january などの可能性があります。
  • 日付は任意の形式である可能性があり、その一部として他のテキストを含む場合と含まない場合があるため、「(z)」と「\n」の間にあるものすべてをキャプチャするために使用できる正規表現があるかどうかを知りたいです'

どんな助けでも大歓迎です!ありがとうございました

4

3 に答える 3

47

以下が機能するはずです。

ABC: *\([a-zA-Z]+\) *(.+)

説明:

ABC:            # match literal characters 'ABC:'
 *              # zero or more spaces
\([a-zA-Z]+\)   # one or more letters inside of parentheses
 *              # zero or more spaces
(.+)            # capture one or more of any character (except newlines)

以下のコメントに基づいて目的のグループ化を取得するには、次を使用できます。

(ABC:) *(\([a-zA-Z]+\).+)
于 2012-10-01T16:25:45.053 に答える
4

あなたが利用している正確な正規表現の実装を知らなくても、私は一般的なアドバイスしかできません。(構文は私が知っているのでperlになります。一部の言語では微調整が必​​要になります)

見つめているABC: (z) jan 02 1999 \n

  • 最初に一致するのは ABC です。したがって、正規表現を使用すると、/ABC:/

  • ABC は常に文字列の先頭にあると言うので/^ABC/、ABC が文字列の先頭にあることを確認します。

  • スペースを\s(大文字と小文字に注意してください) ディレクティブと一致させることができます。すべてのディレクティブで、1 つまたは複数+(または 0 または複数*)と一致させることができます。

  • (and)は予約文字であるため、使用をエスケープする必要があります。それで\(\)

  • 非スペースまたは改行文字と一致させることができます.

  • 何にでも合わせることができ.*ますが、貪欲になりすぎてすべてをキャプチャしないように注意する必要があります。

だからあなたが尋ねたものを捉えるために。私は使うだろう/^ABC:\s*\(.+?\)\s*(.+)$/

私は次のように読みました:

ABC で始まる:

多少の空きがある場合がございます

もっている (

いくつかの文字を持っています

もっている )

多少の空きがある場合がございます

次に、行末 ( $) まですべてをキャプチャします。

http://www.cheatography.com/davechild/cheat-sheets/regular-expressions/に関する次の敷設のコピーを保持することを強くお勧めし ます

于 2012-10-01T16:41:54.437 に答える
1

これで要件を満たすはずです。

ABC:\s*(\(\D+\)\s*.*?)\\n

ここにいくつかのテストがあります http://www.regexplanet.com/cookbook/ahJzfnJlZ2V4cGxhbmV0LWhyZHNyDgsSBlJlY2lwZRiEjiUM/index.html

正規表現についてさらに読む: http://www.regular-expressions.info/characters.html

于 2012-10-01T16:28:50.297 に答える