2014-06-17 4 views
3

대학에서 "java 구문"컴파일러를 빌드해야합니다. 변수 유형 및 변수 이름 (int num, String str 등)을 일치 시키려면 정규 표현식을 사용하고 싶습니다. 그래서 var 유형 (String, int, char, boolean, double) 중 하나와 일치하는 정규식이 필요합니다. 그리고 그 뒤에 적어도 하나의 공백 및 var 이름이 있지만 var 이름은 입니다.은 해당 유형 중 하나가 될 수 없습니다. 어떻게하면됩니까? 정규식에 특정 문자열을 포함하지 않는 방법

(String|int|char|boolean|double)[\s]+([a-zA-Z]+[\w]*^(String|int|char|boolean|double)) 

내가이 아니 자바 정규 표현식 구문을 알고 (단 하나의 '\'대신 2 개),하지만 난 http://regexpal.com/이 시도하고 작동하지 않습니다 : 나는 시도했다.

고맙습니다.

답변

3

당신이 그것을 (우리가 문자열의 시작 부분에 있음을 주장하려고 앵커 인)이 곳

^가 작동하지 않습니다 부정적 예측. 하지만 가까이 있었고, 그냥 따라 에테르 : 괄호의 시작 부분에 ?!를 추가하는 경우, 그것은 부정적 예측로 바뀝니다 :

(String|int|char|boolean|double)\s+(?!(?:String|int|char|boolean|double)\b)[a-zA-Z]+ 

See demo

  • 주위에 괄호 \s\w 제거 (불필요한).
  • 음수 lookbehind (?!(?:String|int|char|boolean|double)\b)은 뒤에 오는 것이 사용자 유형 중 하나가 아니라고 주장합니다. 어설 션이 성공하면 엔진은 [a-zA-Z]+
  • 에 지정된 var와 일치하도록 진행합니다. 자세한 내용은 참조 섹션을 참조하십시오.

참조

+0

참고로, 작은 버그를 고정 dded 데모. 질문이 있으면 알려주세요. :) – zx81

+0

고맙습니다. !!! 그것은 작동합니다. – Vipasana

+0

오신 것을 환영합니다. 듣기 좋습니다! 작동하기 때문에 대답의 왼쪽에있는 체크 표시를 클릭하여 동의하는지 표시 할 수 있습니까? 이것은 rep 시스템이 작동하는 방식이며 응답을받는 것은 응답자와 사용자 모두에게 평판을 얻습니다. 건배! – zx81

0

나는 모든 경우에 대한 일을 생각 대답 ..이

public static void main(String[] args) { 
    String s = "String String1"; 
    System.out.println(s.matches("(?!((String|double)\\s+(String|double|\\d+|$)$))(.*)")); 
} 

O/P : 
String s = "String String1"; 
answer : true 

String s = "String String"; 
answer : false 

String s = "String 123"; 
answer : false 

String s = "String "; 
answer : false 
관련 문제