Chr3is:
私は正規表現を次のようしています。 (([a-zA-Z0-9?]{4,8})(-[a-zA-Z0-9?]{4,8})+-([a-zA-Z0-9?]{4,8}))
どのように私は、少なくとも一桁1つの文字(-ZA-Z)が含まれていない照合シーケンスを避けることができますか?
例えば:
このテキストは: Hello World 123 abc 1AB2C-D3FGH-456I7-JK8LM-NOP9Q Hello World 123 abc
返す必要があります1AB2C-D3FGH-456I7-JK8LM-NOP9Q
この: Hello World 123 abc 11111-1111-1111 Hello World 123 abc
若しくは
Hello World 123 abc aaaa-aaaa-aaaa-aaa Hello World 123 abc
何も返さないはずです。
私はJavaで開発し、このようなグループを取得します:
public List<String> getKeys() {
keys = new ArrayList<>();
Matcher matcher = KEY_REGEX.matcher(text);
while (matcher.find()) {
keys.add(matcher.group());
}
return keys;
}
ありがとう!
第四鳥:
一つの方法は、肯定先読みを使用することで(?=
、少なくともAZの発生や数字をチェックするために0-9
発生を一致させるには-
、両方を見つけるために先読みして、あなたは文字クラスに追加することができます。
マッチング、あなたはときに一致する文字A-Z0-9を開始し、先頭に追加グループ繰り返し-
のない連続発生がないように-
していない起動時や終了時に。
\b(?=[A-Z0-9-]*[A-Z])(?=[A-Z0-9-]*[0-9])[A-Z0-9]+(?:-[A-Z0-9]+)+\b
\b
ワード境界(?=[A-Z0-9-]*[A-Z])
文字AZアサート(?=[A-Z0-9-]*[0-9])
桁アサート0-9[A-Z0-9]+
A-Z0-9のマッチ1+出現(?:-[A-Z0-9]+)+
A-Z0-9の繰り返しマッチング1+出現-
前に追加\b
ワード境界
注[A-z]
以上一致したより[A-Za-z]
4-8の出現に文字クラスを制限します:
\b(?=[A-Z0-9-]*[A-Z])(?=[A-Z0-9-]*[0-9])[A-Z0-9]{4,8}(?:-[A-Z0-9]{4,8})+\b