문자열 구문 분석, 숫자와 문자 추출
-
09-09-2019 - |
문제
문자열을 구문 분석하고 숫자와 문자를 추출하는 가장 쉬운 방법은 무엇입니까? 다음 형식 (번호 | 문자 또는 문자 | 번호), 즉 "10a", "b5", "c10", "1g"등에있을 수있는 문자열이 있습니다.
"10a" -> "10"과 "a"와 같은 두 부분을 추출해야합니다.
업데이트: 모든 훌륭한 답변에 대해 모두에게 감사드립니다
해결책
가장 쉬운 방법은 아마도 정규식을 사용하는 것입니다.
((?<number>\d+)(?<letter>[a-zA-Z])|(?<letter>[a-zA-Z])(?<number>\d+))
그런 다음 문자열과 일치시키고 그룹에서 값을 추출 할 수 있습니다.
Match match = regex.Match("10A");
string letter = match.Groups["letter"].Value;
int number = int.Parse(match.Groups["number"].Value);
다른 팁
가장 쉽고 빠른 것은 간단한 문자열 작업을 사용하는 것입니다. 사용 IsDigit
방법 문자가 어디에 있는지 확인하고 문자열의 나머지 부분을 숫자로 구문 분석하는 방법 :
char letter = str[0];
int index = 1;
if (Char.IsDigit(letter)) {
letter = str[str.Length - 1];
index = 0;
}
int number = int.Parse(str.Substring(index, str.Length - 1));
char letter = str.Single(c => char.IsLetter(c));
int num = int.Parse(new string(str.Where(c => char.IsDigit(c)).ToArray()));
이 솔루션은 매우 엄격하지는 않지만 ( "5A2"와 같은 것을 허용하고 'A'와 52를 반환 할 수 있습니다) 목적에 적합 할 수 있습니다.
그냥 다르기 위해 :
string number = input.Trim("ABCDEFGHIJKLMNOPQRSTUVWXYZ".ToCharArray());
string letter = input.Trim("0123456789".ToCharArray());
내가 이것에 접근하는 방법은 다음과 같습니다. 이 단계를 밟고 GC1 [ "Letter"], GC1 [ "Number"], GC2 [ "Letter"] 및 GC2 [ ""Number "]를 시계 창에 넣을 수 있습니다. 물론 여기에 코드 라인).
정기적 인 epxRession은 각각의 경우 하나 이상의 문자와 숫자가 필요한 패턴을 취합니다.
Regex pattern = new Regex("^(?<letter>[a-zA-Z]+)(?<number>[0-9]+)|(?<number>[0-9]+)(?<letter>[a-zA-Z]+)$");
string s1 = "12A";
string s2 = "B45";
Match m1 = pattern.Match(s1);
Match m2 = pattern.Match(s2);
GroupCollection gc1 = m1.Groups;
GroupCollection gc2 = m2.Groups;
사용 스프라치 그리고 일부 Linq Kung-Fu :
var tagParser =
from a in Parse.Number.Or(Parse.Letter.Once().Text())
from b in Parse.Letter.Once().Text().Or(Parse.Number)
select char.IsDigit(a[0]) ?
new{Number=a, Letter=b} : new{Number=b, Letter=a};
var tag1 = tagParser.Parse("10A");
var tag2 = tagParser.Parse("A10");
tag1.Letter; // should be A
tag1.Number; // should be 10
tag2.Letter; // should be A
tag2.Number; // should be 10
/* Output:
A
10
A
10
*/
제휴하지 않습니다 StackOverflow