2017-01-31 4 views
0

Engine Name 470/485HP and some other text here about 100RPM or torque과 같은 문자열이 있고 HP 앞에 오른쪽 숫자를 추출하고 싶습니다. 이 예제에서 메서드는 485을 반환해야합니다. 숫자는 정수로 보장됩니다 (걱정할 필요가 없습니다 -123.45). 패턴 digitsHP은 문자열 당 한 번만 나타납니다. 1234-5678HP과 같은 사례가 발생할 수 있으며 5678이 예상되는 결과입니다. 공백으로 문자열을 분할하는 방법을 생각해 냈습니다. 각 문자열은 HP로 끝나는 지 검사합니다. 그럴 경우 메서드는 마지막 숫자 블록을 찾아 저장합니다. 이 작업을 수행하는 더 좋은 방법은 무엇입니까? 나는 그것이 정규 표현식일지도 모른다라고 생각한다. 당신의 정규식에 HP 추가특정 접두사가있는 정수 가져 오기 [Java]

public static void main(String[] args) { 

    String myStr = "Engine Name 470/485HP and some other text here about 100RPM or torque"; 
    List<Integer> list = parseIntegerWithSuffixIgnoreCase(myStr, "HP"); 
    System.out.println(list.get(0)); 
} 

public static List<Integer> parseIntegerWithSuffixIgnoreCase(String input, String suffix) { 
    List<Integer> result = new ArrayList<>(); 
    String[] rawStrings = input.split("\\s"); 

    for (String rawString : rawStrings) { 
     if (rawString.toUpperCase().endsWith(suffix)) { 

      Pattern p = Pattern.compile("[0-9]+"); 
      Matcher m = p.matcher(rawString); 
      List<String> allNumericMatches = new ArrayList<>(); 
      while (m.find()) { 
       allNumericMatches.add(m.group()); 
      } 
      Integer value = Integer.parseInt(allNumericMatches.get(allNumericMatches.size() - 1)); 
      result.add(value); 
     } 
    } 
    return result; 
} 
+2

사용'\\ ㄴ \\ d 개 +이 그룹을 캡처하지 수단 문자열

  • \w+ 제로 이상의 비 단어 문자의 끝을 의미 ? = HP \\ b)'또는 ['\\ b (\\ d +) HP \\ b'] (http://ideone.com/6im4kH). –

  • +0

    왜 처음에는'split'을 사용하기로 결정 했습니까? '123hp'가 무시되어야하는'foo123hpbar'와 같은 데이터를 문자열에 포함 할 수 있습니까? – Pshemo

    +0

    예, 'split()'은 기껏해야 무상으로 보입니다. 최소한 샘플 입력이 어떤 표시 일지라도 검색 속도를 느리게 할 가능성이 있습니다. – markspace

    답변

    2

    ...이 방법

     Pattern p = Pattern.compile("([0-9]+HP)"); 
         Matcher m = p.matcher("asdf 123HP 123"); 
         if (m.find()) 
          System.out.println("result - " + m.group(1)); 
    
    +0

    나는 더 일반화했다 : 'String matcherPattern = "([0-9] +"+ suffix + ")"; 패턴 p = Pattern.compile (matcherPattern); ' 위대한 작품입니다. 감사합니다. – Stepan

    +0

    당신은 환영합니다. – TedTrippin

    +0

    OP는 포함 된 접미사를 원하지 않습니다. 이 경우 "\\ D (\\ d +) HP"는 청구서에 부합합니다. 또는 "\\ D (\\ d +)"+ 접미사 – WillD

    3

    사용 : 여기

    public static List<Integer> parseIntegerWithSuffixIgnoreCase(String input, String suffix) { 
        List<Integer> result = new ArrayList<>(); 
        Pattern pattern = Pattern.compile(String.format("(\\d+)%s(?:$|\\W+)", suffix)); 
        Matcher matcher = pattern.matcher(input); 
        while (matcher.find()) { 
         result.add(Integer.parseInt(matcher.group(1))); 
        } 
        return result; 
    } 
    

    내가이 정규식 사용하고 있습니다 : (\d+)SUFFIX(?:$|\W+)

    • (\d+)을 - 수단 제로 O 이상의 숫자와하게 포착 기 1
    • $
    • (?:)은 (