2016-08-12 6 views
1

Учитывая следующую строкуРегулярное выражение для извлечения экземпляра ID, AMI ID тома ID

Создано CreateImage (я-b9b4ffaa) для AMI-dbcf88b1 от по объему-e97db305

Я хочу иметь возможность извлечь следующий с помощью регулярного выражения

я-b9b4ffaa AMI-dbcf88b1 т-e97db305

Это регулярное выражение, которое я придумал, что в настоящее время не делать то, что мне нужно:

Pattern p = Pattern.compile("Created by CreateImage([a-z]+[0.9]+)([a-z]+[0.9]+)([a-z]+[0.9]+)",Pattern.CASE_INSENSITIVE); 
Matcher m = p.matcher("Created by CreateImage(i-b9b4ffaa) for ami-dbcf88b1 from vol-e97db305"); 
System.out.println(m.matches()); --> false 

ответ

1

Вы можете все слова, начинающиеся с букв, а затем с дефисом, а затем с буквенно-цифровой символы:

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

+0

Спасибо за быстрый ответ, я 'd хотел бы включить префикс "Created by CreateImage", если возможно –

+0

Вы можете легко добавить его к сопоставимым значениям, не так ли? Или нужно ли «Создавать с помощью CreatImage» с регулярным выражением? –

+0

Я хотел бы быть частью регулярного выражения, да –

Смежные вопросы