2013-05-14 5 views
0

에 의해 내가 좋아하는 캐릭터있어? 나는 [a-zA-Z0-9] (우리가 모르는 것들)이 배열에 저장된다는 것을 의미합니까?Spliting 정규식 또는 EBNF

  • 사람
  • +
  • 에 fname
  • 문자열
  • +
  • :

    ^create [a-zA-Z][a-zA-Z0-9]* [s|b]?[+|[-]|=][a-zA-Z][a-zA-Z0-9]*[ ]?:[ ]?[a-zA-Z][a-zA-Z0-9]*(, [s|b]?[+|[-]|=][a-zA-Z][a-zA-Z0-9]*[ ]?:[ ]?[a-zA-Z][a-zA-Z0-9]*)*; 
    

    내가 배열을 가져올 : 즉

    이 정규 표현식을 사용하여
  • LNAME
  • 문자열
  • -
  • INT

감사

+0

예제 입력란을 줄 수 있습니까? – Bill

+0

예제 입력 줄은 해당 문자열입니다. – Hladeo

답변

0

당신은이 방법

String[] tokens = "create Person +fname : String, +lname: String, -age:int;" 
     .split("[\\s:;,]+|(?<=[+\\-])"); 
     //split on set of characters containing spaces:;, OR after + or -. 
for (String s : tokens) 
    System.out.println("=> " + s); 

출력 그것을 분할 시도 할 수 있습니다 :

,536에게 당신이 당신의 배열의 시작 부분에 create을 넣어 것입니다 볼 수 있듯이
=> create 
=> Person 
=> + 
=> fname 
=> String 
=> + 
=> lname 
=> String 
=> - 
=> age 
=> int 

그래서 그냥 tokens[1]에서 반복 시작합니다.

분할 규칙의 일부로 ^create\\s을 추가 할 수는 있지만 토큰 배열 시작 부분에 빈 문자열이 표시되므로 아무 것도 해결되지 않습니다.

+0

regexp 또는 ebnf로 "catch"결과를 얻을 수있는 함수가 있는지, 즉'create'와 같은 상수 문자를 무시하면 궁금합니다. – Hladeo

+0

@Hladeo 당신이 무엇을하려고하는지 잘 모르겠습니다. 'a bb x dd'와 같은 패턴이 있고'a'와'c '라고 말할 수있는 것을 찾고 싶다면 regex "(\\ w +) bb (\\ w +) dd "a 아래에 있던 내용은 그룹 (1)과 그룹 (2)에 저장됩니다. – Pshemo

+0

@Hladeo 당신은 'inputString.replaceAll ("\\ b (word1 | word2 | word3) \\ b", "")와 같이 쪼개기 전에 무시하고 싶은 첫 단어를 제거 할 수 있습니다. split ("regexForSplit")' – Pshemo

0

정규 표현식은 많은 것들을 위해 훌륭하지만 때로는 실제 렉서가 필요합니다. JFlex이 좋습니다. 처리 할 수없는 토큰 화 작업은 없습니다. 좀 더 나아가 파스 트리를 만들려면 JavaCC 또는 ANTLR을 선택하는 것이 좋습니다.