2011-10-30 20 views
0

私は次の文字列マッチ言葉

D_Doc Name L_Linked Doc Q_1_5 

または

D_Doc Name L_Linked Doc Q_5 

を持って、私は次のよう

Doc Name 
Linked Doc 
1_5 or 5 
にマッチする正規表現の作成に苦労しています

D_Doc名前は常に表示されます L_とQ_は

ではありません

文字列も、私が発見された試合 マッチ[「DOCNAME」]や、私が知っているので、いくつかの意味を完全な方法としてマッチを参照できるようにしたいと思い

D_Doc Name Doc Q_1_5 
D_Doc Name Doc Q_5 
D_Doc Name L_Linked Doc 

以下とどのように見えるかもしれませんそうではありません。

提案がありますか?

+0

出力は、これらすべての例から、正確に何をすべきですか? – FailedDev

+0

私はマッチ結果に1から3の値を持たせたいと思います。接頭辞の後と次の前にすべて(Doc Name、Linked Doc、1_5 or 5) –

+0

これはどうでしょうか? D_Doc名前Doc Q_5ここでDoc Name Doc、5 – FailedDev

答えて

1

私が正しくあなたを理解していれば、あなたがしたい正規表現のようなものです:

^D_(?<D>.*?)(L_(?<L>.*?))?(Q_(?<Q>.*))?$ 

それはいくつかのテスト入力のために、以下の結果が得られます:

Input       D    L   Q 
D_Doc Name L_Linked Doc Q_1_5 Doc Name  Linked Doc 1_5 
D_Doc Name Doc Q_1_5   Doc Name Doc    1_5 
D_Doc Name Doc Q_5    Doc Name Doc    5 
D_Doc Name L_Linked Doc  Doc Name  Linked Doc 
D_Doc Name Doc Q_5    Doc Name Doc    5 
+0

あなたの男。魅力的な作品:) –

0

多分、この問題のために正規表現は少し大きすぎます。私は単純なstring.Split(s、 '')を使用して、単語を1つずつ、多分最後の単語の正規表現で分析します。また、最後の単語は簡単に分割することができます。私はあなたのコードを単に配列で作業するのが簡単だと思います。

+0

これは私が考えていたもので、既に始まっていますが、正規表現がどれほど強力か、それが可能か早いかを見たいと思っていました。 –

+0

正規表現は非常に強力ですが、正規表現のエキスパートでなければ、その構文で表現することはいつか難しくなり、迷惑になることがあります。パフォーマンスについてはそれほど悪くはありませんが、これらの文字列はそれほど大きくありません。最適化された正規表現の作成は容易ではありません。 –

+0

あなたのコードは、私は配列を示唆しているのでいっぱいです:) –

0

あなたの要件は、解読には少しトリッキーですが、私は、これはそれを行うだろうと思う:

D_(\w+) (\w+) (L_(\w+))?(\w+)((Q_)?(\w+))?

、あなたは(私は、適切な名前であると仮定するものと)「名前付きグループ」を追加したい場合:

D_(?<Doc>\w+) (?<DocName>\w+) (L_(?<Linked>\w+))?(?<LinkedDoc>\w+)((Q_)?(?<Q>\S+))?