Вы можете все слова, начинающиеся с букв, а затем с дефисом, а затем с буквенно-цифровой символы:
String s = "Created by CreateImage(i-b9b4ffaa) for ami-dbcf88b1 from vol-e97db305";
Pattern pattern = Pattern.compile("(?i)\\b[a-z]+-[a-z0-9]+");
Matcher matcher = pattern.matcher(s);
while (matcher.find()){
System.out.println(matcher.group(0));
}
// => i-b9b4ffaa, ami-dbcf88b1, vol-e97db305
См детализирует Java demo
Pattern:
(?i)
- случай нечувствительным модификатор (встроенный вариант флага)
\\b
- граница слова
[a-z]+
- 1 или более ASCII буквы
-
- дефис
[a-z0-9]+
- 1 или более буквенно-цифровые.
Чтобы убедиться, что появляются эти значения в той же строке после Created by CreateImage
используйте \G
-На регулярное выражение:
String s = "Created by CreateImage(i-b9b4ffaa) for ami-dbcf88b1 from vol-e97db305";
Pattern pattern = Pattern.compile("(?i)(?:Created by CreateImage|(?!\\A)\\G)(?:(?!\\b[a-z]+-[a-z0-9]+).)*\\b([a-z]+-[a-z0-9]+)");
Matcher matcher = pattern.matcher(s);
while (matcher.find()){
System.out.println(matcher.group(1));
}
См this demo.
Следует отметить, что выше шаблон основан на \G
операторе, который совпадает с концом последнего успешного матча (так что соответствует только после матча или после Created...
) и закаленные жадный маркер (?:(?!\\b[a-z]+-[a-z0-9]+).)*
(соответствие любого символа, отличных от символа новой строки который не запускает последовательность: word boundary
+ letters
+ -
+ letters|digits
), который является очень ресурсоемким.
Вы должны рассмотреть возможность использования двухступенчатого подхода к первой проверке, если строка начинается с Created...
строки, а затем обработать его:
String s = "Created by CreateImage(i-b9b4ffaa) for ami-dbcf88b1 from vol-e97db305";
if (s.startsWith("Created by CreateImage")) {
Matcher n = Pattern.compile("(?i)\\b[a-z]+-[a-z0-9]+").matcher(s);
while(n.find()) {
System.out.println(n.group(0));
}
}
См another demo
Спасибо за быстрый ответ, я 'd хотел бы включить префикс "Created by CreateImage", если возможно –
Вы можете легко добавить его к сопоставимым значениям, не так ли? Или нужно ли «Создавать с помощью CreatImage» с регулярным выражением? –
Я хотел бы быть частью регулярного выражения, да –