Как выразить конвейер/цеполоJAVA

Программисты JAVA общаются здесь
Anonymous
Как выразить конвейер/цеполо

Сообщение Anonymous »

Я должен извлечь единицы измерения и величины из струнных текстов. Как в этих образцах: < /p>

Original String // result:

abc1mgabc // extract 1 and mg separately
abc100mlabc //100 and ml
abc256kgabc //256 and kg
< /code>

До сих пор в первый момент я использую это регулярное выражение: < /p>

(?i)\d{1,5}(mg|g|gr|kg|ml|l)


Для извлечения количества и единицы и хранить в Quant_unit String.

После этого я применяю к Quant_Unit Эти два регулярных выражения: \ d и (? i) (Mg | g | gr | kg | Ml | l) , чтобы воспринимать соответственно. < /p>

Но я думаю, что он должен иметь способ извлечь его отдельно, применяя только регулярное выражение (для каждого элемента для извлечения) по исходной строке? Из этого). < /p>

Использование собственного регулярного выражения или класса шаблонов из Java. < /p>

Я создаю перечисление для легкого доступа к шаблонам: < /p>

public enum Patterns {

//the expression is: (?i)\d{1,5}(mg|g|gr|kg|ml|l)
QUANTITY_UNIT("(?i)\\d{1,5}(" + MeasureUnit.getRegex() + ")"),
QUANTITY("\\d"),
UNIT("(?i)(" + MeasureUnit.getRegex() + ")");

private Pattern pattern;

Patterns(String patternString) {
System.out.println(patternString);
pattern = pattern.compile(patternString);
}

public Pattern getPattern() {
return pattern;
}

public Matcher getMatcher(CharSequence input) {
return getPattern().matcher(input);
}

public String findGroup(CharSequence input) {
Matcher matcher = getMatcher(input);
matcher.find();
return matcher.group();

}
< /code>

и модульный тест для желаемого поведения: < /p>

public class PatternsTest {

@Test
public void quantityUnit() {
String testString = "abc1kgabc1l";
String fg = Patterns.QUANTITY_UNIT.findGroup(testString);
Assert.assertEquals("1KG", fg);
}

@Test
public void quantity() {
String testString = "abc1kgabc1l";
String fg = Patterns.QUANTITY.findGroup(testString);
Assert.assertEquals("1", fg);
}

@Test
public void unity() {
String testString = "abc1kgabc1l";
String fg = Patterns.UNIT.findGroup(testString);
Assert.assertEquals("kg", fg);
}

}
< /code>



edit < /h2>

Я сделал некоторый рефакторинг на основе комментариев e ответов, теперь он работает нормально: < /p>

public enum Patterns {

QUANTITY_UNIT("(?i)([0-9]+)(" + MeasureUnit.getRegex() + ")");

private Pattern pattern;

Patterns(String patternString) {
pattern = pattern.compile(patternString);
}

public Pattern getPattern() {
return pattern;
}

public Matcher getMatcher(CharSequence input) {
return getPattern().matcher(input);
}

public String getQuantity(CharSequence input) {
final int group_idx = 1;

Matcher matcher = getMatcher(input);
boolean found = matcher.find();
return found ? toLower(matcher.group(group_idx)) : "";
}

private String toLower(String input) {
return input.toLowerCase();
}

public String getUnity(CharSequence input) {
final int group_idx = 2;

Matcher matcher = getMatcher(input);
boolean found = matcher.find();
return found ? toLower(matcher.group(group_idx)) : "";
}
}
< /code>



test: < /h2>

public class MeasureUnityTest {

@Test
public void quantity() {
String testString = "abc1kgabc1l";
String fg = QUANTITY_UNIT.getQuantity(testString);
Assert.assertEquals("1", fg);
}

@Test
public void unity() {
String testString = "abc1kgabc1l";
String fg = QUANTITY_UNIT.getUnity(testString);
Assert.assertEquals("kg", fg);
}

@Test
public void unityUpperCase() {
String testString = "abc1KGabc1l";
String fg = QUANTITY_UNIT.getUnity(testString);
Assert.assertEquals("kg", fg);
}

@Test
public void unityNoOccurrence() {
String testString = "fasfasfasfaf";
String fg = QUANTITY_UNIT.getQuantity(testString);
Assert.assertEquals("", fg);
}

@Test
public void unityEmptyString() {
String testString = "";
String fg = QUANTITY_UNIT.getQuantity(testString);
Assert.assertEquals("", fg);
}

/* If more than one matches, return the first*/
@Test
public void unityMoreThanOne() {
String testString = "abc5mlabc5kg";
String fg = QUANTITY_UNIT.getUnity(testString);
Assert.assertEquals("ml", fg);
}

/* If more than one matches, return the first*/
@Test
public void quantityMoreThanOne() {
String testString = "abcm5mlabc1kg";
String fg = QUANTITY_UNIT.getQuantity(testString);
Assert.assertEquals("5", fg);
}

}


Подробнее здесь: https://stackoverflow.com/questions/353 ... xpressions

Вернуться в «JAVA»