2016-05-03 17 views
1

クライアント/マター番号に一致する正規表現を.NETで記述しようとしています。クライアント番号またはマター番号は一連の文字または数字で構成され、クライアント/マター番号は/-、または.で区切られたクライアント番号とマテリアル番号のコンボです。たとえば、0204A/101です。次の文字列で重複するマッチを除外するための正規表現

はFoo [101分の1234]バー456B/102バズ私はそれが[1234-101]456B/102に一致させたい

[^a-zA-Z0-9]*([a-zA-Z0-9]+[/\.\-]{1}[a-zA-Z0-9]+)[^a-zA-Z0-9]* 

私はキャプチャグループを使用して、各マッチからクライアント/マター番号を抽出することができます。

問題は次のとおりです。日付の最初の2つのコンポーネントまたは最後の2つのコンポーネントがクライアント/マター番号の一致と誤って解釈されないように、日付を除外します。たとえば、私の文字列に5/3/2016があるとしたら、 "Foo [1234-101] bar 456B/102 baz 5/3/2016"と入力した場合、5/3/は一致しません。これに対処するために、私は最初に、最終的な否定範囲の最後に/\.\-を追加してみました:私の数量詞*がゼロ以上であるので、それだけで発生するものとして否定範囲を扱うため

[^a-zA-Z0-9]*([a-zA-Z0-9]+[/\.\-]{1}[a-zA-Z0-9]+)[^a-zA-Z0-9/\.\-]* 

これはかかわらず、動作しませんでした0回と一致して5/3に一致します。理にかなって

[^a-zA-Z0-9]*([a-zA-Z0-9]+[/\.\-]{1}[a-zA-Z0-9]+)([^a-zA-Z0-9/\.\-]+|$) 

しかし、これだけでマッチした/3/2016:次に、私はそれそう否定範囲1回以上発生したか、それは文字列の最後に遭遇したいずれか作ってみました。

パターンを調整して1つのインスタンスに一致させることはできますが、重複するインスタンスでは失敗することはできますか?たとえば、5/3foo 5/3 barとし、3/2016foo 3/2016 barに一致させますが、5/3/または/3/2016ではなく、foo 5/3/2016 barに一致させます。あなたが尋ねたよう

+0

あなたの望むものと一致して覚えておいてください。 –

答えて

2
(?<![\/\-\.a-zA-Z0-9])([a-zA-Z0-9]+[\/\-\.][a-zA-Z0-9]+)(?![\/\-\.a-zA-Z0-9]) 

作品完璧に、Regex101 demo


例参照:フーを[1234-101]バー456B/102バズ2016年5月3日

マッチ: 1234-101456B/102

例はFoo [1234-101]バー2016年5月22日

マッチ:1234-101

+0

ありがとうございます。残念ながら、それはかなり正しく動作しません。 "Foo [1234/101] bar 5/22/2016"と試してみると、私の言いたいことが分かります。 –

+0

更新!それは妥当性のための実行を与えます –

+0

ありがとう、しかしそれはまだ文字列の最後に何も一致しません。 "Foo 1234/101"。 –

0

使用以下の正規表現:

[^\/0-9a-zA-Z]([0-9a-zA-Z]+[\/.-][0-9a-zA-Z]+)[^\/0-9a-zA-Z] 

オンラインデモ(regexstorm's C# regex tester

説明

  • 文字クラス([...])ので、数量詞{1}は不要で、単一の文字を表します。

  • 完全なテスト文字列と正規表現を一致させる必要はありません。これを行うには、アンカー(^$)を区切り文字として使用します。そのように、グローバルマッチングが指定されていると、正規表現エンジンはパターンのすべての一致と一致します。

  • 先頭と末尾のスラッシュはパターンが一致しないようにし、日付文字列を保持します。

アップデート

  • C#のregexenので、速記から戻っという名前の文字クラスをサポートしていないようです。

  • ターゲットパターンの代替区切り文字としてアンカーを追加しました。したがって、テスト文字列の最初または最後の一致が成功します。ルック周りのアプローチに

+0

私はこれを 'foo 5/3'でテストし、' 5/3'とマッチして私を驚かせました。あなたのパターンの最後の '[^ \ /]'が「正確に1つの非順スラッシュ」と一致すると思われる場合、それは文字列の最後にある入力と一致するのはなぜですか? –

+0

さて、私は何が起こっているのか理解しました。 'foo 5/3'の後に改行があったので(改行ではないので'/'ではありません)。このパターンは、文字列が一致したいもので終わると機能しません。私の文字列が 'foo 5/3'で、' 5/3'とマッチしたい場合。 –

+0

パターンが修正されました – collapsar

0

An alternativeは、このように、フォームwrong|(right)で消費するパターンです:

\d+\/\d+\/\d+|(\b\w+[-\/\.]\w+\b) 

あなたが一致して、明示的なものは、あなたがしたくない\d+\/\d+\/\d+を食べる(と忘れます) (\b\w+[-\/\.]\w+\b)

関連する問題