2012-01-06 2 views
12

regEx가 언어별로 공통적이라는 것을 알고 있습니다 ... 그러나 Java 구문을 작성하는 데 문제가 있습니다. 정규식이 JS로 코딩되어 있습니다.Javascript 정규 표현식을 Java 구문으로 변환

if((/[a-zA-Z]/).test(str) && (/[0-9]|[\x21-\x2F|\x3A-\x40|\x5B-\x60|\x7B-\x7E]/).test(str))   
return true; 

Java로 어떻게 작성합니까? 난 그냥 잘못된 이스케이프 문자 내가 그것을 시도하고 \의 X를 말하는에서 추가

import java.util.regex.Matcher; 
import java.util.regex.Pattern; 

을 가져온

..

답변

27

변경 선도적 '"''/' 문자를 후행하고, 각 '\'"\\"으로 바꿉니다.

Javascript, Perl 및 다른 스크립팅 언어와 달리 Java에는 정규식에 대한 특수 구문이 없습니다. 대신 (일반적으로) Java 문자열 리터럴을 사용하여 표현됩니다. 그러나 '\'은 Java 문자열 리터럴의 이스케이프 문자이므로 원래 정규식의 각 '\'은 두 번째 '\'으로 이스케이프되어야합니다. (그리고 정규 표현식에 리터럴 백 슬래시 문자가있는 경우 Java 문자열 리터럴에 "\\\\"이 생깁니다.)

이것은 Java 초심자에게는 다소 혼란 스럽지만 어려운 것입니다. 그러나 완전히 논리적입니다. 자바 문자열 리터럴을 사용하여 정규 표현식을 표현하고 있음을 기억하십시오.


그러나 @antak 노트와 같이 Java와 Javascript의 정규 표현식 언어에는 다양한 차이점이 있습니다. 그래서 당신이 자바 정규 표현식을 가져 와서 위와 같이 자바에 음역한다면, 작동하지 않을 수 있습니다.

다음은 차이점을 요약 한 참고서입니다. https://en.wikipedia.org/wiki/Comparison_of_regular_expression_engines

+0

들으 lot..I 꽤 각 교체 '를 \'로 ... 2 부분을하지 않았다 '\'..... 자들은 모두 동일하지? – testndtv

+0

@testndtv - "2 번째 백 슬래시로 ** 이스케이프 처리 **해야합니다." 나는 그것이 대체되어야한다고 말하지 않았다. –

+0

답변을 북마크에 추가하는 방법이 있었으면 좋겠다. 잠깐. 북마크. 어쨌든 감사합니다. – hypd09

3

당신이해야 할 유일한 것은 슬래시를 다시 복제하는 것입니다.

Pattern p1 = Pattern.compile("[a-zA-Z]"); 
Pattern p2 = Pattern.compile("[0-9]|[\\x21-\\x2F|\\x3A-\\x40|\\x5B-\\x60|\\x7B-\\x7E]"); 

if (p1.matcher(str).find() && p2.matcher(str).find()) { 
    return true; 
} 
+0

Thx 많이 ... if ... 줄에 대한 구문 오류가 발생했습니다. – testndtv

+1

@testndtv : 오류를 표시하지 않고 오류가 발생하지 않는다고 말하지 마십시오 (예 : 메시지. –

+0

두 번째'find()'호출이 누락되었습니다. 지금 해보십시오. –

0

자바 정규 표현식은 가장 먼저 문자열, 그래서 당신은 /을 따옴표로 시작하지 않아야합니다. 또한 자바에서는 \\과 같은 두 가지를 수행하여 \을 탈출해야합니다.

자세한 내용은 Oracle에서 this 자습서를보십시오.

+1

정규식 엔진 자체가 아니고, 정규식을 소비해야하는'matches()'메소드이다. 마치 양쪽 끝에 고정 된 것처럼 전체 문자열. 'find()'메쏘드는 좀 더 전통적인 종류의 매치를 수행하지만'matches()'와 같이 String 객체에서 호출 할 수는 없습니다; [AlexR did] (http://stackoverflow.com/a/8754491/20938)과 같이 Matcher 객체를 명시 적으로 만들어야합니다. –

+0

@ AlanMoore : 알려 줘서 고마워. find를 거의 사용하지 않았고, 거의 항상 matches()를 사용했습니다. 내 대답에서 해당 섹션을 제거했습니다. 다시 설명해 주셔서 감사합니다. – npinti

1

나는 이것이 도움이 될 것이라고 생각합니다. 자바에서는 java에서 자바 스크립트를 실행하는 클래스가 있습니다. 어떤 생각이라도 환영합니다.

javax.script.ScriptEngineManager se = new javax.script.ScriptEngineManager(); 
     javax.script.ScriptEngine engine = se.getEngineByName("js"); 

String regExp = "/^\\d+$/";<br> 
engine.put("str", "1234");<br> 
engine.eval("var rgx="+regExp);<br> 
Object value = engine.eval("function validate(r, s){ return (r).test(s);};validate(rgx, str);");<br> 
logger.log(value); 
관련 문제