2009-03-18 18 views
2

사용자가 여러 컴퓨터에 문자열을 삽입한다고 가정 해보십시오.문자열에서 정규 표현식을 사용하여 부분 문자열 추출

한 컴퓨터에서 구성의 패턴은 해당 문자열의 일부 문자를 추출하고 위치 4에서 5로 말합니다. 다른 컴퓨터에서 추출 패턴은 다른 문자를 반환합니다 (예 : 문자열의 마지막 3 자리 .

이러한 구성 (정규식 패턴)은 컴퓨터마다 다르며, 소스 코드를 변경하지 않고도 관리자가 변경할 수 있어야합니다.

몇 가지 예 :

  Original_String  Return_Value 
User1 - abcd78defg123   78 
User2 - abcd78defg123   78g1 
User3 - mm127788abcd   12 
User4 - 123456pp12asd   ppsd 

가이 정규식 함께 할 수 ? 감사합니다. .

+0

일치하려는 대상에 대한 다른 예를 들어 주시겠습니까? 길이와 형식이 다양합니까? 아니면 항상 4 자, 2 자, 4 자 및 3 자입니까? –

답변

1

이 정규식 캡처 값을하는 것이 수도 (수) 또는 Microsoft MSVC를 위해 나는 []

User4 - 123456pp12asd   ppsd 
생각

은 여기에 2 개의 별도 캡처 영역이 있다는 점에서 가장 흥미 롭습니다. 그 (것)들을 함께 결합하는 방법에 약간 기본 규칙 있는가 또는 그 때 결과를 만드는 방법을 지정할 수 있고 싶는가?

아마도

r/......(..)...(..)/\1\2/ for ppsd 
r/......(..)...(..)/\2-\1/ for sd-pp 

같은 당신이 캡처를 얻고 그들에게 자신을 처리 할 수있는 정규식을 실행하려면, 또는 고급 조작 명령을 실행하려면 어떻게합니까?

+0

이것은 내가 찾고 있었던 것이다! C#에서는 결과가 어떻게 반환 될지 지정할 수 없다고 생각합니다.이 패턴을 적용 할 수 있습니다^...... (..) ... (..) $ 그리고이 경우에는 처리해야합니다. 각 match.Group [x] 내 자신. 고마워요! –

+0

이봐,하지만 C#에서 모든 경기를 처리하는 방법을 알고 있다면 알려줘! –

7

왜 이것을 정규식으로 사용 하시겠습니까?

string foo = s.Substring(4,2); 
string bar = s.Substring(s.Length-3,3); 

(당신이 경계 검사 충분히 쉽게 길이에 약간을 할 사람들을 마무리 할 수 ​​있습니다) 당신이 정말로 원하는 경우

, 당신은에 Func<string,string>에서 그것을 마무리 수 : 무엇이 잘못입니다 어딘가에 넣어 - 그래도, 귀찮게 거라고 확실하지 :

Func<string, string> get4and5 = s => s.Substring(4, 2); 
Func<string,string> getLast3 = s => s.Substring(s.Length - 3, 3); 
string value = "abcd78defg123"; 
string foo = getLast3(value); 
string bar = get4and5(value); 
+0

나는 나 자신을 설명하지 않았다. 그 죄송합니다. 나는이 모든 패턴을 특별한 경우에 적용되는 테이블에 갖고 싶습니다. –

+0

나는 위의 [4,2]와 [-3,3]을 표현하는 간단한 구문을 생각할 수 있다고 확신한다. (여기서 ~은 "오른쪽에서"를 의미한다.) –

+0

다시 컴파일하십시오. –

1

난 당신이 정규식을 사용하여 얻을 수 있었으면 무엇 확실하지 않다. RegEx는 패턴 일치에 사용됩니다. 위치를 기반으로 추출하려면 하위 문자열 만 사용하십시오.

1

Regex는 실제로 해결책이 아닙니다. 위치에 POS (0부터 시작)와 길이 길이의 시작 문자열의 일부를 반환하려면, 당신은 단순히 같은 하위 문자열 함수를 호출 :

string section = str.Substring(pos, length) 
1

그룹화. /^.{3}(.{{}))/와 일치하고 예를 들어 그룹 $ 1을 (를) 볼 수 있습니다.

질문은 이유가 무엇입니까? 일반적인 문자열 처리, 즉 실제 부분 문자열 메서드는 의도에서 더 빠르고 명확 해집니다.

3

당신이 정말로 정규식 사용하려면 :

^...(..) 

를 실행 한 다음, 추가 (일반적으로 사용 사용에 대한 정규식 컴파일러에 따라)

.*(...)$ 
+0

. * 정규식 # 2에서 필요하지 않습니다. 마지막 세 문자 앞에 아무것도 보지 않아도됩니다. – Tomalak

+0

불필요한 것이지만 역 추적을 줄입니다. 이제 첫 번째 표현식 ('. *')을 전체 문자열로 확장 한 다음 마지막 세 문자 만 역 추적하여 전체 표현식에 대한 일치 항목을 얻습니다. 그렇지 않으면 끝에 도달했는지 여부를 각 문자에서 확인합니다. – Gumbo

+0

당신의 대답은 제가 얻고 자하는 결과의 일부였습니다. 감사. –

관련 문제