2017-02-21 9 views
2

Я знаю, что это задавали миллион раз, но я не могу заставить его работать. Я фильтрую строки из веб-интерфейса игры (http://pathofexile.com/api/public-stash-tabs - Осторожно, из-за того, что будет получено 5 Мбайт данных из GET), пытаясь найти, какой тип атрибута я ищу, потому что мне потом нужно его заменить. (Я рассматриваю массив «explicitMods» в каждом из объектов Item и определяю, какой тип модификатора он есть.)Regex Matching, Java. Match & Extract

Моя цель - сначала определить, с каким типом модификатора я имею дело, а затем использовать String.replaceAll, чтобы заменить правильные строки на ##, чтобы позднее можно было заменить ## на фактические значения и искать. Я бы сохранил значения или диапазоны, чтобы впоследствии определить то, что соответствует. String.replaceAll не входит сюда, потому что этот бит работает просто отлично.

Это мой тестовый класс. Все тесты терпят неудачу. Я действительно тестировал каждый шаблон на regex101.com, чтобы убедиться, но у них есть только те тесты javascript, php, python и golang. Каждый комментарий метода имеет ссылку на тест, который я сделал для regex101.

package arbitrary.package.name; 

import org.junit.Test; 
import org.slf4j.Logger; 
import org.slf4j.LoggerFactory; 

import java.util.regex.Matcher; 
import java.util.regex.Pattern; 

import static org.junit.Assert.assertTrue; 

public class RegexTests { 

    private static Logger log = LoggerFactory.getLogger(RegexTests.class); 

    @Test 
    public void testIntegers() { 
    // https://regex101.com/r/PVfYGX/1 
    assertTrue(compileAndMatch("/.*(.\\d+).+(.\\d+).*/", "Adds 80 to 115 Physical Damage")); 
    } 

    @Test 
    public void testIntegersWithRanges() { 
    // https://regex101.com/r/u3UQqM/1 
    assertTrue(compileAndMatch("/.*(\\d+-\\d+).*(\\d+-\\d+).*/", "Adds (4-5) to (8-9) Physical Damage")); 
    } 

    @Test 
    public void testDecimals() { 
    // https://regex101.com/r/CpaV1y/1 
    assertTrue(compileAndMatch("/.*(\\d+.?\\d+).*/", "0.2% of Elemental Damage Leeched as Life")); 
    } 

    private boolean compileAndMatch(String regex, String text) { 
    Pattern pattern = Pattern.compile(regex); 
    Matcher matcher = pattern.matcher(text); 
    log.info("{} {} \"{}\"", regex, matcher.matches() ? "matches" : "does not match", text); 
    return pattern.matcher(text).matches(); 
    } 
} 

Образец StackTrace (все же):

2017-02-20 20:35:44.876 [main] INFO arbitrary.package.name.RegexTests - /.*(\d+.?\d+).*(\d+.?\d+).*/ does not match "Adds (4-5) to (8-9) Physical Damage" 

java.lang.AssertionError 
    at org.junit.Assert.fail(Assert.java:86) 
    at org.junit.Assert.assertTrue(Assert.java:41) 
    at org.junit.Assert.assertTrue(Assert.java:52) 
    at arbitrary.package.name.RegexTests.testIntegersWithRanges(RegexTests.java:23) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 

Заранее спасибо за вашу помощь,

ответ

1

Использование

".*(\\d+-\\d+).*(\\d+-\\d+).*" 

Java

String regex = ".*(\\d+-\\d+).*(\\d+-\\d+).*"; 
String text = "Adds (4-5) to (8-9) Physical Damage"; 
Pattern pattern = Pattern.compile(regex); 
Matcher matcher = pattern.matcher(text); 

System.out.println(matcher.matches()); 
+0

Большое спасибо. Умение JavaScript просачивается в Java, глупая ошибка. – Qbert

0

Вы должны удалить / в начальном и конечном положении

+0

Спасибо, Кервин, это правильно. Я написал в ответе другого парня как ответ, потому что он ответил перед вами. – Qbert