2015-09-28 3 views
1

Мне нужно регулярное выражение, чтобы найти все совпадения для моего шаблона.Regex найти все совпадения

текст что-то вроде этого:

"someother text !style_delete [company code : 43ev4] between text !style_delete [organiztion : 0asj9] end of line text" 

И я хотел бы, чтобы найти все матчи по схеме:

!style_delete [.*] 

Я попытался, как это:

Pattern pattern = Pattern.compile("!style_delete\\s*\\[.*\\]"); 

При этом текст матча будет следующим:

!style_delete [company code : 43ev4] between text !style_delete [organiztion : 0asj9] 

Но я ожидал следующим образом:

match 1 : !style_delete [company code : 43ev4] 
match 2 : !style_delete [organiztion : 0asj9] 

Пожалуйста, помогите мне, что будет регулярное выражение в Java, чтобы получить над выходом.

+0

Не могли бы вы привести пример текста, который вы пытаетесь сопоставить? – David

+0

Вы можете заменить '. *' В скобках на '[^]] *'. Это будет соответствовать всем внутри квадратных скобок вместо правой квадратной скобки, чтобы вы случайно не потребляли слишком много. – FriedSaucePots

+0

Чтобы попробовать ваши шаблоны регулярных выражений, вы всегда можете использовать некоторые онлайн-тестеры regexp (google "online regexp", чтобы иметь несколько). Я часто использую https://regex101.com –

ответ

1
@Test 
public void test() { 
    final String input = "someother text !style_delete [company code : 43ev4] between text !style_delete [organiztion : 0asj9] end of line text"; 
    // my regexp:strong text 
    // final String regex = "(!style_delete\\s\\[[a-zA-Z0-9\\s:]*\\])"; 
    // regexp from Trinmon: 
    final String regex = "(!style_delete\\s*\\[[^\\]]*\\])"; 

    final Matcher m = Pattern.compile(regex).matcher(input); 

    final List<String> matches = new ArrayList<>(); 
    while (m.find()) { 
     matches.add(m.group(0)); 
    } 

    assertEquals(2, matches.size()); 
    assertEquals("match 1: ", matches.get(0), "!style_delete [company code : 43ev4]"); 
    assertEquals("match 2: ", matches.get(1), "!style_delete [organiztion : 0asj9]"); 
} 

редактировать

возможно образец от ответа Trinimon является немного более элегантно. Я обновил регулярное выражение с регулярным выражением.

1

Это потому, что .* жадный. Используйте вместо этого:

"!style_delete\\s*\\[[^\\]]*\\]" 

Это означает: сопрягать все в кронштейне за исключением закрывающейся ].

Или сделать содержание между [] он не жадный:

"!style_delete\\s*\\[.*?\\]" 
3

Вы должны использовать non-greedy соответствия:

start.*?end 

В вашем случае, картина:

!style_delete\\s\\[(.*?)\\] (Even simple to understand than first version :)) 

Доказательство (Java 7):

String string = "someother text !style_delete [company code : 43ev4] between text !style_delete [organiztion : 0asj9] end of line text"; 
Pattern pattern = Pattern.compile("!style_delete\\s\\[(.*?)\\]"); 
Matcher matcher = pattern.matcher(string) ; 
while (matcher.find()) { 
    System.out.println(matcher.group()); 
} 

Ссылка на доказательство: http://ideone.com/Qtymb3

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