java example 문자열을 큰 따옴표 안에 포함하지 않은 쉼표로 쪼개십시오.




java split example (2)

나는이 질문을 일찌감치 물었고, 그것이 중복 되었기 때문에 닫혔다. 나는 받아 들였고 실제로 질문 자바 에서 답을 찾았다 . 쉼표로 구분 된 문자열을 쪼개었지만 쉼표를 따옴표 로 붙이지 않았다.

하지만 이후로 또 다른 문제가 생겼습니다. 분명히해야 할 일은 ","을 제 구분자로 사용하거나, 큰 따옴표가 있거나 심지어 괄호 안에 들어있는 ","을 무시할 때 사용합니다.

그래서 다음과 같습니다 :

"Thanks,", "in advance,", "for("the", "help")"

tokenize는 다음과 같습니다.

  • 감사,
  • 미리,
  • for ( "the", "help")

어쨌든 내가 이것을 허용하기 위해 사용하고있는 현재 정규 표현식을 수정해야할지 모르겠다. 그러나 어떤 지침도 인정 될 것이다.

line.split(",(?=([^\"]*\"[^\"]*\")*[^\"]*$)");

Answer #1

가정에서 만든 파서는 쉽게 작성됩니다.

예를 들어,이 ANTLR 문법은 많은 문제없이 예제 입력을 처리합니다.

parse
  :  line*
  ;

line
  :  Quoted ( ',' Quoted )* ( '\r'? '\n' | EOF )
  ;

Quoted
  :  '"' ( Atom )* '"'
  ;

fragment
Atom
  :  Parentheses
  |  ~( '"' | '\r' | '\n' | '(' | ')' )
  ;

fragment
Parentheses
  :  '(' ~( '(' | ')' | '\r' | '\n' )* ')'
  ;

Space
  :  ( ' ' | '\t' ) {skip();}
  ;

이스케이프 된 따옴표 또는 괄호를 고려하여 이것을 확장하는 것이 쉽습니다.

그 문법에 의해 생성 된 파서를 다음 두 줄의 입력에 넘길 때 :

"Thanks,", "in advance,", "for("the", "help")"
"and(,some,more)","data , here"

다음과 같이 파싱됩니다.

대체 텍스트 http://i47.tinypic.com/258otvs.png

이것을 위해 ANTLR을 사용하는 것을 고려한다면, 내가 원한다면 내가 게시 한 문법으로부터 파서를 얻기 위해 약간의 HOW-TO를 게시 할 수있다.


Answer #2

때로는 원치 않는 것 대신 원하는 것을 쉽게 매칭 할 수 있습니다.

String s = "\"Thanks,\", \"in advance,\", \"for(\"the\", \"help\")\"";
String regex = "\"(\\([^)]*\\)|[^\"])*\"";
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(s);
while(m.find()) {
    System.out.println(s.substring(m.start(),m.end()));
}

산출:

"Thanks,"
"in advance,"
"for("the", "help")"

대괄호 안에있는 따옴표 섹션에서 닫는 대괄호를 무시해야하는 경우 다음이 필요합니다.

 String regex = "\"(\\((\"[^\"]*\"|[^)])*\\)|[^\"])*\"";

이 두 번째보다 복잡한 버전이 필요한 문자열의 예는 다음과 같습니다.

 "foo","bar","baz(":-)",":-o")"

산출:

"foo"
"bar"
"baz(":-)",":-o")"

그러나 가능하다면 데이터 형식을 변경하는 것이 좋습니다. 토큰을 저장하기 위해 XML과 같은 표준 형식을 사용하면 훨씬 쉬울 것입니다.





split