2015-02-03 3 views
1
Regex= 
"^\\s+(\\S+)\\s+(\\S+)\\s+(\\S+)\\s+(\\S+)(\\s+(\\S+(\\s+(\\S+))?))?(\\s+(\\S+))?\\s*"; 

input= " 1 ABC DEF GHI JKL PQR "; 

을 반환하지만 JKL 내가 선택처럼 approched 그래서 정규 표현식 "JKL MNO"와 같은 공간 단어 수 있습니다 경우가 있습니다정규 표현식 그룹 매칭은 정규 표현식과 일치 위의 입력 텍스트에서 잘못된 값

(\\s+(\\S+))? 

G1: 1 G2: ABC G3: DEF G4: GHI **G6: JKL PQR** G8:PQR 

G6 즉 내가 잘못된 값을 얻고 그룹을 점점 MNO 존재, 당신은 내가 뭘 잘못 파악하시기 바랍니다 수있는 단어로만 JKL 또는 JKL MNO 수 있어야하지만.

+0

는 PQR 부분입니다 또한 선택 사항입니까? –

+0

예 .PQR, MNO 또는 JKL MNO는 선택 사항입니다. – Anil

답변

1

은 부품 (\\s+(\\S+(\\s+(\\S+))?))의 내부 (\\s+(\\S+))?PQR과 정규식의 마지막 부분을 읽고있다.

마지막 부분을 선택 사항으로 지정하면 문제가 해결됩니다. 그러나 캡쳐하지 않으려는 경우, 예를 들어 캡처 그룹을 너무 많이 사용하지 않아도됩니다.공백이 아닌 캡처 할 수 - 그래서, 당신은 아마 당신의 정규식을 변경할 수 있습니다 (?:\\s+)

을 :

String str = "^\\s+(\\S+)\\s+(\\S+)\\s+(\\S+)\\s+(\\S+)(?:\\s+(\\S+(?:\\s+\\S+)?))?(?:\\s+(\\S+))\\s*"; 

공지 사항 여기에 문제의 부분 :

(?:\\s+(\\S+(?:\\s+\\S+)?))? 

당신이 볼 수 있듯이 존재하는 경우 JKLJKL MNO을 캡처하는 데 충분한 단일 캡처 그룹입니다. MNO을 따로 캡처하려면 내측 \\S+도 캡처 그룹으로 만듭니다.

+0

필수 항목입니다. JKL PQR 또는 JKL MNO PQR은 선택 사항입니다. :) – Anil

+0

아직도 정확히 어떤 부분을 이해하지 못합니다 .. 나는 이해한다 -'JKL'은 필수이고,'MNO'는 선택 사항이며'PQR'은 필수 항목입니다. 올바른 요구 사항입니까? –

+0

아니요, 1 ABC DEF GHI는 필수이며 JKL MNO PQR은 선택 사항입니다. JKL MNO는 JKL 또는 JKL MNO 일 수있는 공백이있는 단어입니다. – Anil

0

PQR이 필수 인 경우 (\\s+(\\S+))?에서 마지막으로 ?을 제거하면됩니다.

RegEx는 욕심이 많으므로 마지막 부분이 선택 사항 인 경우 그룹 8에서 PQR이 걸릴 것입니다 (문제입니다).

전체 정규식은 다음과 같아야합니다 "^\\s+(\\S+)\\s+(\\S+)\\s+(\\S+)\\s+(\\S+)(\\s+(\\S+(\\s+(\\S+))?))?(\\s+(\\S+))\\s*"

2

귀하의 관찰 행동은 정규 표현식에 대해 예상되는 것입니다. 캡처 그룹은 그룹의 여는 괄호로 시작하여 끝 괄호로 끝납니다. 캡처 그룹 A는 캡처 그룹 B가 포함되어있는 경우, A는

(\\s+(\\S+(\\s+(\\S+))?))?

매칭

 JKL PQR

에 대한 그룹 1입니다 B.

을 모두 포함 될 것입니다

 JKL PQR
그룹 2가
JKL PQR
그룹 3은
 PQR
이 될 것이며 그룹 4는 다음 그룹 1 JKL 및 그룹이 될 것

(?:\\s+(?:(\\S+)(?:\\s+(\\S+))?))?

: 당신은 그냥 JKL은 그룹이 될하려는 경우

PQR

수, 당신은 같은 캡처 그룹과 비 캡처 그룹의 조합을 사용할 수 있습니다 2는 PQR이됩니다. (\\s+(\\S+))?가 선택되고, 아무것도 독서하지 끝 - 어떻게됩니까

0

나는 당신을 위해 무엇을 찾고있는 것은 생각 :

^\\s+(\\S+)\\s+(\\S+)\\s+(\\S+)\\s+(\\S+)(\\s+(\\S+(\\s+(\\S+))??))?(\\s+(\\S+))?\\s*$ 

패턴이 꺼려 (비 욕심) 정량 ??을 사용합니다. 이것은 필요한 경우에만 그룹 7이 일치 함을 의미합니다.

" MNO"이 누락되면 그룹 7이 전혀 일치하지 않습니다. 그룹 6에는 " JKL" 만 포함됩니다. 당신이 문자열 앵커의 끝을 사용하는 경우

, 당신은 " MNO"이 그룹이 꺼려 정량 ?? 선택 사양 인 경우에도 그룹 (7)에 의해 일치 강제됩니다. 패턴이 왼쪽에서 오른쪽으로, " PQR"가 그룹 (7)합니다 (정량 ? 기본적으로 욕심 때문에)와 그룹 (9) 그 이후 아무것도 일치하지 않습니다 일치됩니다에서 평가되기 때문에 그룹 (6)은 꺼려 정량없이

" JKL MNO"을 포함 선택 사항입니다.

참고 : 쓸모 캡처 그룹없이, 당신은 쓸 수 있습니다 :

^\\s+(\\S+)\\s+(\\S+)\\s+(\\S+)\\s+(\\S+)(?:\\s+(?:(\\S+)(?:\\s+(\\S+))??))?(?:\\s+(\\S+))?\\s*$ 
0

오히려 내 눈은 내가 분할 가고 싶어 수영을 할 정규 표현식을 사용하는 것보다 :

String[] toks = input.split("\\s+"); 

toks.length을 toks[0]부터 toks[3]까지 4 이상이어야합니다. 지금 :

  • toks.length의 == 5 : 이것은 "JKL"이어야
  • toks.length == 7 : 우리 [5] 및 PQR toks에 toks [4]와 toks에 "V"가 [6]

그렇다면 toks.length == 6은 어떻습니까? 선택 품목 인 "MNO"는 선택 품목 인 "PQR"보다 강하거나 반대 방향입니까? 두 경우 모두 String []과 길이를 사용하여보다 쉽게 ​​결정할 수 있습니다.

는 (나는 "JKL"와 "MNO"사이에 공백의 수가이 길을 잃은 것을 알고있다. 정말 중요한 경우, 그것은 작은 노력으로 원래 문자열에서 검색 할 수 있습니다.)