コンマで区切られた値のリストと一致する正規表現、末尾のコンマは許可されません。

コンマで区切られた値のリストと一致する正規表現、末尾のコンマは許可されません。

一致させたい項目:

  1. あああ
  2. ああああ
  3. ああ、bbb、ccc

しかし、いいえ末尾のカンマのリストです。私のもの現在の正規表現:

(\w{3},?)+

また、aaa,bbb,末尾のカンマ()があるリストと一致します。私もできると思いました。する:

(\w{3})(,\w{3})*

しかし、かなり醜いです。私の実際の正規表現は3文字の単語と一致せず、より大きな単語と一致し、正規表現を繰り返すのは面倒です。この問題をどのように解決しますか?

答え1

名前を付けてください。大きいPCREの正規表現は次のとおりです。

(?<big>[a-zA-Z0-9]+)

それ以降のすべての内容は?<name>その名前で記録されます。
と言う正規表現サブルーチン

したがって、繰り返し(?&name)が簡単になります。

^(?<big>[a-zA-Z0-9]+)(,(?&big))*$

オンラインテスト

したがって、IPマッチングなどがより簡単になります。

^(?<ip>25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(.(?&ip)){3}$

オンラインでテストしてみてください

次のようにgrepで使用します。

grep -P '^(?<ip>25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(.(?&ip)){3}$'

答え2

perlあるいは、PCRE正規表現を使用する場合は、(?1)最初のキャプチャグループで正規表現を参照するのと同じ方法を使用して重複を回避できます。

grep -Px '(?:(\w{3}),)*(?1)'

これは、3文字の単語で構成される空でないカンマ区切りリストと一致します。に変更:

grep -Px '(?:(?:(\w{3}),)*(?1))?'

空のリストが許可されます。

答え3

使用してください -^((([a-zA-Z0-9]){1,45},){2}([a-zA-Z0-9]){1,45})$

ここでは英語の最長の単語が45文字なので、最大文字数を45文字に設定しましたが、要件に応じて変更できます。

答え4

正規表現は簡単です。[^,]$質問に答えてください。

コメントを送ってくれた@Hkoofに感謝!

関連情報