2012-10-25 5 views
0

안녕하세요 제가 처음 대장으로까지 패턴 만 걱정이 가능한 문자열정규 표현식을 한 번 이상 JAVA

signal CS, NS, dl: stateType := writeOrRead0; 
signal CS, pS : stateType := writeOrRead0; 
signal dS : stateType := writeOrRead0; 

하는 패턴

에 대해 문자열과 일치하는 것을 시도하고있다 .

하지만 신호수는 서너도 이 그것을하지만 제 2 개 개의 신호를 선택한다 제가

^signal\\s*(\\w+),*\\s*(\\w+)\\s*: 

이 정규 표현하고 초 수 있었다 하나 이상이 될 수 규정 하나는 내가

matcher.group() 

는 별도로

수있는 사람의 g를 마련 사용할 때 다음 신호에서 CS 및 PS 및하지만 D와 S를 선택합니다 두 개 또는 세 개가 있는지 여부와 상관없이 모든 신호 이름을 선택하는 표현식을 사용하십시오.

+0

FYI :/테스트 정규 표현식을 사용하면 좋은 장소입니다. http://www.regexplanet.com/advanced/java/index.html –

답변

5

신호 이름마다 그룹을 지정하려는 경우 불가능합니다 (신호 수의 상한이 없으면 전체를 쓸 수 있지만 매우 못생긴 경우).

그래서 쉼표로 구분 된 이름이 포함 된 그룹 하나와 함께 살아야 할 것입니다. 그러면 실제 시그널 이름을 알아내는 포스트 프로세싱을 할 수 있습니다.

^signal\s+((?:\w+(?:,\s*)?)*)\s*: 

같은 (I 자바 문자열로 탈출하지 않습니다.)

그룹 1을 줄 것

은 당신의 이름입니다.

본 정규식을 사용할 수
+0

너무 느리다 ... my regex는 "^ signal (\\ s * \\ w + ,?) + \\ s * :"입니다. 그리고 쉼표로 잘라내어 쪼개고 결과를 자릅니다. – PhiLho

4

나는 다음 일을 할 것 :

1 받기 신호의 전체 GROUP : CS, NS,

2가

귀하의 예를 구문 분석 (예를 들어) DL :

1 ^signal\\s((\\w*)(?:,\\s)?)+

2 지금 당신이 지금의 간단한 분할에 "DL CS, NS,"같은 그룹에있는 문자열이 ","당신은 그들을 배열 할 수 있습니다.

0

:

^신호 \ S ([\ \ s에 승]

* (= ^)가 공백 신호

시작 캡처? 0 개 이상의 단어가 쉼표와 공백으로 나옵니다. ':'에서 캡처를 끝내지 만 성냥에 포함하지 않습니다. 다음과 같이하면 lookbehind를 사용하여 경기의 신호 자체를 포함하지 위해서는

:

^\ S ([\ w \ S * ((< = 신호?)?= :))

관련 문제