0

私の正規表現は機能していました-キャプチャしていた文字列の形式がわずかに変更されるまで。以前は常に次の形式でした:

Word1 - Word2 - 01.2.3456.7890 - xx-xx - Word 3 [Word-inbracket]

をキャプチャすることに興味があった場所xx-xx

このデータをキャプチャするために、次の正規表現が機能しました。

(.+\s*-\s*.+\s*-\s*.+)\s*-\s*(\w{1,3}\s*-\s*\w{1,3})\s*-\s*.+

そこからグループ[2]を選択します。

ただし、現在は文字列の形式が変更されているため、xx-xx. . (覚えておいてください、これは時々しか起こりません)。

したがって、次の形式の情報も取得する必要があります。

Word1 - Word2 - 01.2.3456.7890 - xx-xx-XxxX - Word 3 [Word-inbracket]
Word1 - Word2 - 01.2.3456.7890 - xXX-XxX-xxxx - Word 3 [Word-inbracket]

等。

以前にキャッチされたものに加えて、この文字列をキャプチャするように正規表現を編集するにはどうすればよいですか? これを行う最もクリーンな方法は何ですか?

4

4 に答える 4

0

少しハックですが、それでうまくいきます:

(.+\s*-\s*.+\s*-\s*.+)\s*-\s*((\w{1,3}\s*-\s*\w{1,3})|(\w{1,4}\s*-\s*\w{1,4}))\s*-\s*.+
于 2012-07-12T13:37:20.097 に答える
0

私はこれがそれを行うべきだと信じています:

(.+?\s*-\s*.+?\s*-\s*.+?)\s*-\s*(\w{1,3}\s*-\s*\w{1,3})\s*(?:-(\w{1,3}))?\s*-\s*.+

私が行った変更は次のとおりです。

  • '?' を追加することで、最初の任意の文字の一致を非貪欲にしました。それらの後に—これにより、余分なビットが存在するときに、それらが飲み込みすぎるのを防ぎます.
  • 「(?:-(\w{1,3}))?」を追加 これは、オプションの余分なビットが存在する場合に一致しますが、「-」プレフィックスをキャプチャしません (「?:」は外部グループを非キャプチャにします)。

これにより、オプションのビットを含む追加のキャプチャ グループが得られます。

ここで実際の動作を見ることができます(編集済み)。

于 2012-07-12T13:42:18.317 に答える
0

これはより明確です .+\s-\s(.+)\s-\s.+$

于 2012-07-12T14:06:28.673 に答える
0

入力行に基づいて、より単純化されたアプローチをまとめて使用できます。

次の正規表現は両方のケースに一致し、変更された部分に対する他の変更にも機能するはずです。

([^-]*-){3}\s*([^\s]+).*

これにより、「Word1 - Word2 - 01.2.3456.7890 -」の最初のグループがキャプチャされ、次に「xx-xx-XxxX」の 2 番目のグループがキャプチャされます。

また、サンプルの文字列にはスペースが含まれていないため、2 番目に必要なグループにはスペースが含まれていないという前提から外れていることに注意してください。

説明:

([^-]*-){3}    # captures the "word1 - word2 - word3.234.234 -" block
\s*
([^\s]+)       # captures the "xx-xx-xxx" block up to the first whitespace char.
.*             # matches the rest of the line
于 2012-07-12T13:45:59.190 に答える