1

文字列を正規表現と一致させました。

3 つの文字と数字の組み合わせを含む文字列を一致させたいと考えています。A、B、または L の後に 1 ~ 3 の数字が続く場合があります。(Lの場合は1~4)

私の質問: 文字が複数回一致する場合、文字列を一致させたくありません。したがって、A、B、および L は 1 回しか発生しません。

これまでの私の表現:

(?:[A|L|B](?(?<=L)[1-4]|[1-3])){3}

この時点で一致するテスト文字列:

L2B1A3
B2L1A2
A1B1L4
A1A2A3

現時点で一致しない文字列:

L4B4A1 (Only L can have a digit that's 4)
L2A1B (Missing digit)

一致させたくない文字列 (現在一致中):

A2A2A3 (The A, B and L only may occur one time!)
4

2 に答える 2

3

私が正しく理解していれば、これはうまくいくでしょう:

^(?=.*A)(?=.*B)(?=.*L)([AB][1-3]|L[1-4]){3}$

を与える

L2B1A3 - マッチ
B2L1A2 - 一致
A1B1L4 - マッチ
A1A2A3 - 一致なし
L4B4A1 - 一致なし
L2A1B - 一致なし

壊す:

^ # 文字列の開始
(?=.*A) # 文字列のどこかに A がなければなりません
(?=.*B) # B は文字列のどこにでも出現する必要があります
(?=.*L) # L は文字列のどこにでも出現する必要があります
( # グループのキャプチャを開始
  [AB][1-3] # A or B と 1-3
  | | # また
  L[1-4] # L と 1-4
){3} # グループ終了
$ # 文字列の終わり

メイン グループが 3 回一致しなければならないときに 3 つの先読みが満たされなければならないという事実は、文字が重複しはならないという条件にも対処します。

于 2016-11-21T14:21:41.110 に答える
1

代替方法を提供するだけです。

^(?!.*([A-Z]).*\1)(?:[AB][1-3]|L[1-4]){3}$

キャプチャ グループ 1 への後方参照を伴う否定先読み (?!.*([A-Z]).*\1)により、文字列内で大文字が 1 回だけ出現することが保証されます。

利点は、ABL よりも多くの文字を正規表現に追加すると、正規表現がより簡潔になることだけです。

于 2016-11-21T14:48:02.980 に答える