나는 이것을 더 잘하는 방법을 찾으려고 노력하면서 자바를 처음 접했습니다. 잠재적으로 정규식을 사용합니다.
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
- 답변 # 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));
관련 자료
- 파이썬에서 정규식 (refindall)을 사용하여 텍스트에서 15 자리 문자열 추출
- linux - Bash/Shell 스크립팅에서 Regex를 사용하여 특정 문자열 검색
- java - 정규식을 사용하여이 문자열을 일치시키는 방법
- javascript - 정규식 패턴을 사용하여 문자열에서 특정 데이터 추출
- Google 스프레드 시트에서 정규식을 사용하여 JSON 구문 분석
- python - 정규식을 사용하여 화학 공식을 어떻게 구문 분석합니까?
- python - 와일드 카드를 사용하여 특정 문자열에 대한 DataFrame을 검색하는 방법
- java - 정규식을 사용하여 문자열에서 특정 문자를 가져오고 사용하지 않는 0을 제거합니다
- REGEX 패턴을 기반으로 Jenkins 파이프 라인에서 Groovy를 사용하여 값을 설정합니다
- 문자열 벡터를 사용하는 동안 C ++의 세분화 오류
- Notepad ++ regex… 모든 고유 문자열을 찾아 새 줄을 포함하여 삭제
- 정규식 - [\ a-z] +로 끝나는 문자열 찾기
- Python C Api를 사용하여 부분적으로 args/kwargs 구문 분석
- java - 중첩 된 루프를 사용하여 다른 문자열에서 문자열 발생
- 파이썬은 정규식으로 문자열을 분할
- scala - 정규식을 사용한 웹 로그 데이터 추출
- apache - htaccess를 사용하여 쿼리 문자열을 파일 확장자로 교체
- Python에서 Regex를 사용하여 특정 문자열 가져 오기
- java - 정규식이 예상 문자열을 찾을 수 없습니다
정규식의 lookbehind를 사용하십시오.
Regex101을 참조하십시오.
Java에서는 다음과 같이 사용하십시오.
결과