2009-08-03 5 views
15

로 추출 문자열 나는이 문자열자바 - 정규식

String myString ="A~BC~FGH~~zuzy|XX~ 1234~ ~~ABC~01/01/2010 06:30~BCD~01/01/2011 07:45"; 

을했습니다 나는이 3 개 하위
1234
6시 반
7시 45분
을 추출해야
이 정규식 \\ d {2} \ : \\ d {2}을 사용하는 경우 첫 번째 시간 만 추출 할 수 있습니다. 06:30

Pattern depArrHours = Pattern.compile("\\d{2}\\:\\d{2}"); 
Matcher matcher = depArrHours.matcher(myString); 
String firstHour = matcher.group(0); 
String secondHour = matcher.group(1); (IndexOutOfBoundException no Group 1) 

matcher.group (1) 예외를 throw합니다.
또한 1234를 추출하는 방법을 모르겠습니다.이 문자열은 바뀔 수 있지만 항상 'XX ~'뒤에옵니다.
이 문자열을 정규식과 일치시키는 방법에 대해 알고 계십니까? 아담의 제안에

UPDATE

덕분에 지금은

Pattern p = Pattern.compile(".*XX~ (\\d{3,4}).*(\\d{1,2}:\\d{2}).*(\\d{1,2}:\\d{2})"; 

내가 수와 일치 내 문자열과 일치하는이 정규식을했습니다, 그리고 matcher.group와 2 시간 (1); matcher.group (2); matcher.group (3);

+0

코드를 보여줄 수 있습니까? 그것은 06:30과 일치해야합니다. 다른 모든 것은 순서대로 있어야합니다. –

답변

36

함수는 단일 정수 인수를 취합니다. 캡처 그룹 인덱스는 1부터 시작합니다. 인덱스 0은 특수한 것으로 "전체 일치"를 의미합니다. 캡처 그룹은 괄호 "(...)"쌍을 사용하여 생성됩니다. 괄호 안에있는 것은 모두 캡처입니다. 그룹은 왼쪽에서 오른쪽으로 (다시 1에서 시작) 번호가 매겨지며 괄호를 열면 그룹이 겹칠 수 있습니다. 정규 표현식에는 괄호가 없으므로 그룹 1이 될 수 없습니다.

Pattern 클래스의 javadoc은 정규 표현식 구문을 다룹니다.

몇 번 반복 될 수있는 패턴을 찾고있는 경우 거짓을 반환 할 때까지 Matcher.find()을 반복적으로 사용할 수 있습니다. Matcher.group(0) 한 번 반복 할 때마다 그 시간과 일치하는 것을 반환합니다.

한 번에 모든 것을 일치시키는 하나의 큰 정규 표현식을 만들려는 경우 (내가 원하는대로 믿을 수 있음) 캡처하려는 세 가지 세트 각각에 대해 캡처 괄호 세트를 넣고, Matcher.match()을 사용하고 Matcher.group(n)을 사용하십시오. 여기서 n은 각각 1, 2 및 3입니다. 물론 Matcher.match()도 false를 반환 할 수 있습니다.이 경우 패턴이 일치하지 않아 그룹을 검색 할 수 없습니다.

예를 들어, 아마도 앞의 텍스트와 일치시키고, 캡처 그룹을 시작하고, 숫자와 일치시키고, 캡처 그룹을 끝내는 등의 작업을 수행하고 싶을 것입니다. 귀하의 정확한 입력 형식이지만 여기에 예제가 있습니다.

Eat 12 carrots at 12:30 
Take 3 pills at 01:15 

내가 수량과 시간을 추출하고 싶었 :

내가 형태의 문자열을 가지고 말할 수 있습니다.내 정규 표현식과 같이 보일 것입니다 :

"\w+ (\d+) [\w ]+ (\d{1,2}:\d{2})" 

같이 보일 것입니다 코드 :

Pattern p = Pattern.compile("\\w+ (\\d+) [\\w ]+ (\\d{2}:\\d{2})"); 
Matcher m = p.matcher(oneline); 
if(m.matches()) { 
    System.out.println("The quantity is " + m.group(1)); 
    System.out.println("The time is " + m.group(2)); 
} 

정규 표현식은 "있는 단어, 공간, 하나 이상의 숫자를 포함하는 문자열을 (의미 그룹 1에서 캡처 된), 공백, 단어 집합 및 공백으로 끝나는 공백, 그 다음에 시간 (그룹 2에서 캡처 된 시간, 시간은 항상 0- 두 자릿수로 채워진 것으로 가정 함). 당신이 찾고있는 것에 더 가까운 예가 될 수 있지만 가능한 입력에 대한 설명은 다소 모호합니다.

+1

Adam, Matcher API와 꽤 혼동스러워했습니다. – mickthompson

+1

안녕하세요, Adam 님, 입력 내용이 항상 동일합니다. XX ~ 문자열 (예제의 경우 1234) 다음에 2 시간과 숫자를 추출해야합니다. 이 숫자는 {3,4} 자릿수가 될 수 있습니다. – mickthompson

+4

다른 사람들에게 도움이되기를 바랍니다. m.group()을 호출하기 전에'm.matches()'(또는'm.find()')를 호출해야합니다 ** 그렇지 않으면 일치하지 않는다고 말할 것입니다 아직 어떤 것을 찾으십시오), 적어도 이것은 Android에서 일어나는 일입니다. –