>source

나는 이것을 더 잘하는 방법을 찾으려고 노력하면서 자바를 처음 접했습니다. 잠재적으로 정규식을 사용합니다.

String text = test.get(i).toString()
// text looks like this in string form:
// EnumOption[enumId=test,id=machine]
String checker = text.replace("[","").replace("]","").split(",")[1].split("=")[1];
// checker becomes machine

내 목표는 그것을 파싱하는 것입니다 text 문자열로 돌아가서 machine . 위의 코드에서 내가 한 일입니다.

그러나 그것은 추악 해 보입니다. 나는 이것을 조금 더 좋게 만들기 위해 여기에 어떤 종류의 정규식을 사용할 수 있는지 궁금합니다. 아니면 다른 제안?

  • 답변 # 1

    정규식의 lookbehind를 사용하십시오.

    (?<=\bid=)[^],]*
    
    

    Regex101을 참조하십시오.

    (?<=     )            // Start matching only after what matches inside
        \bid=             // Match "\bid=" (= word boundary then "id="),
              [^],]*      // Match and keep the longest sequence without any ']' or ','
    
    

    Java에서는 다음과 같이 사용하십시오.

    import java.util.regex.*;
    class Main {
      public static void main(String[] args) {
        Pattern pattern = Pattern.compile("(?<=\\bid=)[^],]*");
        Matcher matcher = pattern.matcher("EnumOption[enumId=test,id=machine]");
        if (matcher.find()) {
          System.out.println(matcher.group(0));
        }
      }
    }
    
    

    결과

    machine
    
    

  • 답변 # 2

    Polarion ALM API를 사용한다고 가정하면 EnumOption '에스 getId 문자열을 통해 값을 분리하고 다시 구문 분석하는 대신 메서드 :

    String id = test.get(i).getId();
    
    

  • 답변 # 3

    바꾸기 및 분할 함수를 사용하면 데이터 구조가 고려되지 않습니다.

    정규식을 사용하려면 둘러보기없이 캡처 그룹을 사용할 수 있습니다. 여기서 enum은 a를 제외한 모든 값이 될 수 있습니다. ] 및 쉼표, id는 다음을 제외한 모든 값이 될 수 있습니다. ] .

    id 값은 캡처 그룹 1에 있습니다.

    \bEnumOption\[enumId=[^=,\]]+,id=([^\]]+)\]
    
    

    설명

    \bEnumOption 시합 EnumOption 단어 경계가 선행 됨

    \[enumId= 시합 [enumId=

    [^=,\]]+, 다음을 제외한 모든 문자를 1 번 이상 일치 = ,]

    id= 말 그대로 일치

    ( 포착그룹 1

    [^\]]+ 다음을 제외한 모든 문자를 1 번 이상 일치 ]

    )\]

    Regex 데모 | 자바 데모

    Pattern pattern = Pattern.compile("\\bEnumOption\\[enumId=[^=,\\]]+,id=([^\\]]+)\\]");
    Matcher matcher = pattern.matcher("EnumOption[enumId=test,id=machine]");
    if (matcher.find()) {
        System.out.println(matcher.group(1));
    }
    
    

    산출

    machine
    
    

    <시간>

    더 많은 쉼표로 구분 된 값이있을 수있는 경우 부정 문자 클래스를 사용하여 ID 만 일치시킬 수도 있습니다. [^][]* 일치하는 ID 전후에 대괄호 경계 안에 머물러 있습니다.

    \bEnumOption\[[^][]*\bid=([^,\]]+)[^][]*\]
    
    

    자바에서

    String regex = "\\bEnumOption\\[[^][]*\\bid=([^,\\]]+)[^][]*\\]";
    
    

    Regex 데모

  • 답변 # 4

    물론 정규식을 사용할 수 있지만 때로는 성능이 떨어지고 가독성이 떨어지고 버그가 발생하기 쉽습니다.

    나는 당신이 스스로 생각하지 않았거나 적어도 완전히 이해하지 않은 정규식을 사용하지 않는 것이 좋습니다.

    추신 : 귀하의 솔루션은 실제로 꽤 읽기 쉽다고 생각합니다.

    정규식이 아닌 또 다른 버전은 다음과 같습니다.

    String text = "EnumOption[enumId=test,id=machine]";
    text = text.substring(text.lastIndexOf('=') + 1);
    text = text.substring(0, text.length() - 1);
    
    

    호의를 베푸는 것이 아니라 반대표가 상처를 입었으므로 여기에 있습니다.

    String input = "EnumOption[enumId=test,id=machine]";
    Matcher matcher = Pattern.compile("EnumOption\\[enumId=(.+),id=(.+)\\]").matcher(input);
    if(!matcher.matches()) {
      throw new RuntimeException("unexpected input: " + input);
    }
    System.out.println("enumId: " + matcher.group(1));
    System.out.println("id: " + matcher.group(2));
    
    

  • 이전 mysql - 테이블에서 2 개월 이상 고객의 진화를 비교
  • 다음 R에서 접선 그리기 및 계산