0

これは私が解析したい文字列です:2 Sep 27 Sep 28 SOME TEXT HERE 35.00

値が次のようになるように、リストに解析したいと思います。

list[0] = 'Sep 28'
list[1] = 'SOME TEXT HERE'
list[2] = '35.00'

私が取り組んできた正規表現:

^\d{1}\s{1}[a-zA-Z]{3}\s{1}\d{2}\s{1}([a-zA-Z]{3}\s{1}\d{2})\s{1}([a-zA-Z0-9]*\s{1})+(\d+.\d+)

私の価値観は次のとおりです。

list[0] = 'Sep 28'
list[1] = 'HERE'
list[2] = '35.00' 

list[1]値はオフです。また、スペースを正しく解析していない可能性がありますが、「つるはし」の本やオンラインでガイダンスを見つけることができませんでした。

4

2 に答える 2

4

問題は2番目のキャプチャグループにあります。

([a-zA-Z0-9]*\s{1})+

括弧で囲まれたグループが繰り返され、単語、、のそれぞれに個別に一致'SOME''TEXT''HERE'2番目のキャプチャグループに最後の一致のみが残ります'HERE'

+ キャプチャする括弧で囲まれたグループの内側に配置し、キャプチャしない括弧を使用(?:...)して既存のグループを囲む必要があります。(?:グループを開始および終了するために使用される非キャプチャー括弧は、グループをキャプチャー)せずにマッチの一部をグループ化するための正規表現の方法です。非キャプチャグループで繰り返し演算子(、、、、または)を使用して、式全体をキャプチャできます。+*{n}{n,m}

((?:[a-zA-Z0-9]*\s{1})+)

合計で:

/^\d{1}\s{1}[a-zA-Z]{3}\s{1}\d{2}\s{1}([a-zA-Z]{3}\s{1}\d{2})\s{1}((?:[a-zA-Z0-9]*\s{1})+)(\d+.\d+)/

ちなみに、これはかなり不格好な正規表現です。{1}単一の一致がデフォルトであるため、正規表現で実際に指定する必要はありません。同様に、タイピングは。より\d\d1文字少なくなり\d{2}ます。また、おそらく\wの代わりに必要です[a-zA-Z0-9]。大文字と小文字は気にしないようですので、/iオプションを使用して文字クラスを単純化することをお勧めします。このようなものは、より慣用的な正規表現です。

/^\d [a-z]{3} \d\d ([a-z]{3} \d\d) ((?:\w* )+)(\d+.\d+)/i

最後に、正規表現に関するRubyのドキュメントは少し薄いですが、Rubyはやや標準的なPerl互換の正規表現を使用しており、正規表現の詳細については、通常、regular-expressions.infoを参照してください。

于 2012-08-26T17:45:39.593 に答える
1

あなたもここにいてこのツールを試したことがあるかもしれませんが、Rubularを強くお勧めします。非常に迅速な文字列解析を提供します。

質問に対する具体的な回答はすでに得られているようです。他の人が正規表現をテストしたり、練習したりできるように、これをドロップしてください。

于 2012-08-26T19:39:03.763 に答える