문제

문자열을 구문 분석하고 숫자와 문자를 추출하는 가장 쉬운 방법은 무엇입니까? 다음 형식 (번호 | 문자 또는 문자 | 번호), 즉 "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
 */
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top