2017-09-01 8 views
0

は、たとえば、私はRegexでは、繰り返しグループの一部と以前の繰り返しのパートをどのように一致させますか?

abcd.efgh.1234.4567 
abcd-efgh-1234-4567 
abcd|efgh|1234|4567 

なく

を受け入れる必要があるので、

私はデータストレージやファイリングシステムを持っていると私はいくつかの形式(レガシー上の理由ではなく、自分のデザインを)受け入れると仮定します

abcd.efgh-1234|4567 

基本的に私が使用する区切り文字について一貫性を持たせる必要があります。私はそれを確認できる正規表現を構築しようとしていますが、私はそれが本当に難しいと思っています。私はここで私は「何の正規表現の参照を探求し、それらがabc-abc-abc様リピートを見つけるために働くだろうか見たが、私の場合、私はそれがabcd一部が異なるようにとだけが、私は同じ区切り文字に

を持っていることを確認できるようにする必要がありますしています今まで持っていた(link to Regex101);

(([a-z1-9]){4}([\.:|])){3}(([a-z1-9]){4}) 

私は何とかその([\.:|])に後方参照を与える必要がありますが、それは自分自身に繰り返す必要があるので、私はそこにそれを置くことはできません。

Regexでこれを行うためにとにかくありますか?

答えて

1

は、あなたはそれが最初に表示されたときに区切り文字をキャプチャし、再び後でそれを参照することができます。

[a-z1-9]{4}([.:|])(?:[a-z1-9]{4}\1){2}[a-z1-9]{4} 

は、正規表現 demoを参照してください。

  • [a-z1-9]{4}は、長さが4ワードに一致します。
  • ([.:|])は、区切り文字と一致してキャプチャします。
  • (?:[a-z1-9]{4}\1){2}は、2番目と3番目のパターンをキャプチャします。区切り文字は、上でキャプチャされた区切り文字と呼ばれます。
  • [a-z1-9]{4}は最後の単語に一致します。
1

あなたの正規表現は、参照してください\w+([.|-])\w+\1\d+\1\d+ことができます:example 1

それは最初に遭遇したのセパレータ( "|"、または " - " "")への後方参照\ 1を使用しています

テスト:

$ cat repeat.txt 
abcd.efgh.1234.4567 
abcd-efgh-1234-4567 
abcd|efgh|1234|4567 
abcd.efgh-1234|4567 

結果:

$ grep -P '\w+([.|-])\w+\1\d+\1\d+' repeat.txt 
abcd.efgh.1234.4567 
abcd-efgh-1234-4567 
abcd|efgh|1234|4567 

あるいは、より一般的な:

$ grep -P '\w+(\W)\w+(\1\w+)+' repeat.txt 
abcd.efgh.1234.4567 
abcd-efgh-1234-4567 
abcd|efgh|1234|4567 

参照:example 2。しかし、最後のものの問題は、反復するグループが最後のオカレンスだけをキャプチャすることである可能性があります。

+0

私はこれもうまくいくと思いますが、もっと一般的なものを探している/希望しています – CodyBugstein

+0

もっと一般的ですか? https://regex101.com/r/FlfRFI/2のように? –

+0

いいえ私は内部のグループの一部と一致する正規表現の方法のような意味だった。あなたが書いた式では(どんな場合でも素晴らしい)、それは繰り返されます。例えば、私の入力には、より多くの文字セット、すなわち 'abcd-efgh-ijkl-mnop-qrs'が含まれていればそれほど素晴らしいものではありません – CodyBugstein

関連する問題