2017-01-23 6 views
-1

特定の文字数のパターンに基づいてRegexを使用して文字列を検索するにはどうすればよいですか?Regexは特定のパターンに基づいて文字列を一致させます

例:

|V.2|58| 
10001|W20101|W20101|G00001||||學徒劍盾|8|9|768||-1|1||||||||40002||||||1|14||2||40027|40028|40029|40030||2|22|113|||||||||||2|50|100|7||||| 
10002|W30101|W30101|G00001||||學徒大斧|9|9|768||-1|1||||||||40003||||||1|17||3||40031|40032|40033|40034||2|26|142|||||||||||2|50|100|9||||| 

私が知っている場合は、各ライン上の58の縦棒が、私は私が持っている情報に基づいて、これらの文字列にマッチする正規表現を設定する方法をそこですか?また、58桁目には、各文字列には縦線の量が表示されます。

10479|I00208||G00005||||青鐵礦|29||0||-1|30||||3|||||||||100|5|1||54|$53$原始的礦石,整體泛著鐵青的色澤。 

#IMG$NoticeIcon#30~45級的副本掉落或跟公會商人購買。 
$7$能與其他材料結合,製作40級的合金材料。 
||||||||||||||||||||||||||| 

もう1つの例です。これは複数の行を持ちますが、依然として58の垂直バーの範囲内にあります。

パターンが垂直バーの量に基づいて正確に一致する方法はありますか?

ありがとうございます!

+0

正確に何が必要なのでしょうか?もっと明確に説明できますか? –

+0

垂直バーの数は唯一の情報ですか?または、縦棒XとX + 1の間にどのような文字列を入れるべきかについての情報はありますか? (検証用) –

+1

'line.Split( '|')。Length == 58'? –

答えて

1

はい、あなたは正規表現でこれを一致させることができ、あなたの即時の質問に答えるために:RegexOptions.Multilineを使用してコンパイルするとき

^[^|]*(?:\|[^|]*){58}*$ 

を、正確に58のバー(および任意の非までの行の最初の文字からマッチしますそれ以降のバー文字)が一致しています。

テストするlive on regex101.com

これは完全にコンテキストを認識しないので、絶対にその番号に依存しています。あなたのサンプルファイルでは、最初の行を一致から除外する必要があります。そうしないと、最初の行に2つの行が含まれます。

しかし、あなたは仕事に適切なツールを使用していないようです。たぶんCSVパーサーが適しているのでしょうか? CSVパーサーが処理できるものである改行を含むエントリには、複数行のデータサンプルで引用符文字が使用されています。また、この正規表現では行えない引用符で囲まれたフィールドにバーがある場合も処理されます。

+0

ありがとう、あなたの答えはティム。私は実際にどのようなツールがこの種の仕事に適しているかを見ていないので、私はそれを調べます。正規表現以来、私はそれが非常に面倒ですが、それは仕事をうまくやるかもしれないと思ったが一致することができます。 – Eperty123

+0

また、58の代わりに59がある場合はどうなりますか?ただそれをテストし、それは比類のないままにしました。どうすればこれを克服できますか? – Eperty123

+0

「58」の代わりに「59」を入れてもうまくいかないのですか?その後、あなたはほとんど幸運から外れています - そうでなければ、行が58のバーの後に終了したら、データセットが終了しているかどうかを正規表現がどのように伝えるべきですか?たぶん59番目のエントリが次の行の先頭にあるかもしれません。おそらく次のレコードがそこから始まるかもしれません... –

関連する問題