이것은 사소한 것처럼 보이지만이 문제를 해결할 수는 없습니다. STL 문자열이 2013 336 (02 DEC) 04
(여기서 04
은 시간이지만 그와는 관련이 없습니다)입니다. 나는 그 달의 날짜 (예제에서는 02
)와 그 달뿐만 아니라 시간을 추출하고 싶다.C++ : 괄호로 묶인 숫자 문자열을 구문 분석
나는 이것을 깨끗하게하려고 노력하고 있습니다. 예를 들어 피하십시오. 괄호에서 문자열을 분할 한 다음 부분 문자열 등을 사용하여 작업하십시오. 이상적으로는 stringstream
을 사용하여 변수로 리디렉션하고 싶습니다. 내가 지금 가지고 코드는 다음과 같습니다
int year, dayOfYear, day;
std::string month, leftParenthesis, rightParenthesis;
std::string ExampleString = "2013 336 (02 DEC) 04";
std::istringstream yearDayMonthHourStringStream(ExampleString);
yearDayMonthHourStringStream >> year >> dayOfYear >> leftParenthesis >> day >> month >> rightParenthesis >> hour;
그것은 year
다음 2013
및 336
하지만 같은 괜찮아 dayOfYear
일이 잘못가는 시작 추출합니다. day
는 843076624.
leftParenthesis
이 (02
그래서는 day
을 포함하지만 yearDayMonthHourStringStream
스트림을 리디렉션 동안 내가 leftParenthesis
변수를 생략 할 때 day
도 0
입니다 0
, month
과 빈 문자열 및 hour
입니다.
이 문제를 해결하는 방법에 대한 아이디어가 있으십니까? 나는 정규 표현을 (아직) 알지 못하지만, 지금 당장 (시간적으로) 배울 여력이 있는지 확실하지 않습니다.
수정 그래, 알겠습니다. 이것은 정규 표현식으로 내 삶을 훨씬 더 쉽게 만들 수있는 10 억 번째 시간과 같지만, 그래서 나는 그것이 시간이라고 생각한다. 어쨌든, 어떤 일을하는 것은이었다
int year, dayOfYear, day, month, hour, minute, revolution;
std::string dayString, monthString;
yearDayMonthHourStringStream >> year >> dayOfYear >> dayString >> monthString >> hour;
std::string::size_type sz;
day = std::stod(dayString.substr(dayString.find("(")+1), &sz); // Convert day to a number using C++11 standard. Ignore the (that may be at the beginning.
이 여전히 monthString
의 처리를 필요로하지만, 그 큰 단점이되지 않도록 나는 어쨌든 번호로 변경해야합니다. 당신이 할 수있는 최선의 일 (정규 표현식)이 아니라 작동하고 너무 지저분하지 않습니다. 필자가 아는 한은 막연하게 이식성이 있으며 새로운 컴파일러로 작업하는 것을 멈추지 않을 것입니다. 하지만 모두에게 감사드립니다.
'leftParenthesis'에서 첫 번째 문자를 버려서 원하는대로 만들 수 있습니다. – JoriO
이것은'* scanf'가 스트림과 비교하여 더 나은 작업을 수행하는 몇 안되는 경우 중 하나입니다. 왜냐하면 입력뿐만 아니라 일치도 수행 할 수 있기 때문입니다. – Angew
부스트를 사용하고 싶은지 확실하지 않지만 Boost.Spirit은이를위한 완벽한 도구입니다. [=> 괄호가있는 예제 구문 분석기] (http://www.boost.org/doc/libs/1_56_0/libs/spirit/doc/html/spirit/qi/tutorials/complex___our_first_complex_parser.html) – leemes