C #에서 정규 표현식을 사용하여 특정 단어 앞에 숫자를 얻는 방법은 무엇입니까?


10

아래 정규 표현식을 사용하여 단어 앞에 숫자를 가져옵니다.

예 :

838123 someWord 8 someWord 12 someWord

(\d+)\s*someWord

그러나 때로는 숫자와 단어 사이에 무언가가 올 수 있습니다. 아래 예제 줄을 참조하십시오.

전의:

Someword 12의 43434 Someword 2323 새로운 someword

정규식을 사용하여 단어 앞에 정확한 숫자를 얻는 방법은 무엇입니까?

당신의 제안을 알려주십시오.


3
기존 게시물이 귀하의 질문에 답변하는 것 같습니다. 답변이 유용한 경우 답변자와 미래 독자에게 알려주십시오 ( 둘러보기 ). 그렇지 않으면 찾고자하는 사항과 답변이 귀하의 사례에 맞지 않는 이유에 대한 자세한 정보를 제공하십시오.
Reza Aghaei

1
당신이 무엇을 요구하는지 명확하지 않은 ...
JohnyL

답변:


14

이 작업을 수행:

(\d+)[^\d]+some[wW]ord

숫자 이외의 다른 것을 허용해야합니다. 또한 둘 다 고려 w하고 W당신의 예를 모두 포함하기 때문이다.

데모


다른 답변을 찾고 있습니까?
Reza Aghaei

@RezaAghaei 아마
CinCout

제공 한 현재 답변의 문제점은 무엇입니까? 어떤 개선을 원하십니까?
Reza Aghaei

@RezaAghaei OP가 어떤 대답도 받아들이지 않았다는 사실은 코너 케이스 나 뭔가를 놓친 경우 생각합니다. 이를 해결하기위한 다른 방법도 환영합니다.
CinCout

1
@ CinCout-ReinstateMonica 누락 된 엣지 케이스에 대한 답변 을 참조하십시오 (OP와 관련이 있는지 확실하지 않음).
Steve Chambers


3

에 대한 일치하는 경우 CinCout의 대답에서 한 가지 "놓친 코너의 경우는" someWord경우 예를 들어, 정확한해야 notsomeWordsomeWordNotThis일치 할 수 없습니다.

해당 정규 표현식에 대한 다음 확장은이를 해결하는 방법을 제공합니다.

(\d+)[^\d]*[^\w]some[wW]ord[^\w]

설명 :[^\w] 전에 나에 대한 정규 후 someWordA의 모습 "비 단어 문자" 이전과 이후 - 라인의 끝은 여기 계산합니다. 물론 정확한 요구 사항에 따라 더 복잡하고 구체적으로 만들 수 있습니다.

데모


3

다음과 같이 시도해보십시오.

(\d+)\s?([^\d]*)

(\d+)    - get the digits
\s?      - discard a possible space
([^\d]*) - get all chars that are not digits

여기서 테스트를 볼 수 있습니다


3

첫째는 분리 some[wW]ord, numberspace패턴으로, 다음에 제 2 패턴을 실행할

 var pattern = @"\b(some[wW]ord|[\d]|\s)*\b";
 var rgx = new Regex(pattern);
 var sentence = "43434 of someword 12 anything someword 2323 new someword";
 var result = string.Empty;
 foreach (Match match in rgx.Matches(sentence)){
     result += match.Value;
}
//output => result: 43434 someword 12 someword 2323 someword

 var patternOnCorrectSentence = @"\b(\d+)\s*some[wW]ord*\b";
 var rgxOnCorrectSentence = new Regex(patternOnCorrectSentence);

 var resultOnCorrectSentence = new List<string>();
 foreach (Match match in rgxOnCorrectSentence.Matches(result)){
     resultOnCorrectSentence.Add(match.Value);
 }
 resultOnCorrectSentence.ForEach(Console.WriteLine);

 Console.ReadKey();

첫 번째 패턴이 실행될 때, 문장은 원하는대로

Someword 12의 43434 Someword 2323 새로운 someword

변화:

43434 Someword 12 Someword 2323 Someword


2

그러나 때로는 숫자와 단어 사이에 무언가가 올 수 있습니다. 아래 예제 줄을 참조하십시오.

전의:

Someword 12의 43434 Someword 2323 새로운 someword

이 시도

(\ d +) (. *?) 단어

설명

\ d +-숫자

. *? -숫자 뒤에는 발생하지만 최소 발생은 없습니다.

someword-다소 정확하게 일치

데모


2

사용 \s*은 0 개 이상의 공백 문자와 만 일치합니다.

사용할 수는 \D+있지만 숫자를 제외한 모든 문자와 일치하므로 줄 바꿈과 일치합니다.

같은 줄의 숫자를 일치 시키려면 부정 문자 클래스에 줄 바꿈을 일치시키지 않을 수 있습니다 [^\d\r\n]

귀하의 예에서는을 사용 \d하지만 하나 이상의 숫자 0-9 만 일치 시키려면 문자 클래스를 사용할 수 있습니다[0-9]+

숫자와 단어가 더 큰 단어의 일부가되는 것을 방지하기 위해 단어 경계를 사용할 수 있습니다 \b

대소 문자를 구분하지 않고 단어를 일치 RegexOptions.IgnoreCase시키려면 인라인 수정자를 사용하십시오.(?i)

(?i)\b([0-9]+)\b[^\d\r\n]*\bsomeword\b

.NET 정규식 데모보기


2

mtch.Groups["Value"].Value필요에 따라 정보를 추출 하려면 명명 된 일치 캡처 (데이터 사용 등)를 사용하십시오.

(?<Value>\d+)     -- Get the digits
(?<Other>.+?)     -- Capture all text, but minimal (greedy) capture
(?<Key>someword)  -- til the keyword here.

위를 실행하면 ( IgnorePatternWhiteSpace달리 주석을 제거하고 같은 실행하는 패턴 가입 (?<Value>\d+)(?<Other>.+?)(?<Key>someword)없이 정규식 옵션 )은 각 데이터 / 키 쌍에 대한 데이터를 얻을 번의 매치에서 각을 구성합니다.

결과

다음은 모든 개별 경기에 포함 된 결과 (두 번째 예)와 그룹 및 캡처가 각 경기에 제공하는 결과입니다.

Match #0
              [0]:  43434˽of˽someword
  ["Value"]  [1]:  43434
      1 Captures:  43434
  ["Other"]  [2]:  ˽of˽
      2 Captures:  ˽of˽
    ["Key"]  [3]:  someword
      3 Captures:  someword
Match #1
              [0]:  12˽anything˽someword
  ["Value"]  [1]:  12
      1 Captures:  12
  ["Other"]  [2]:  ˽anything˽
      2 Captures:  ˽anything˽
    ["Key"]  [3]:  someword
      3 Captures:  someword
Match #2
              [0]:  2323˽new˽someword
  ["Value"]  [1]:  2323
      1 Captures:  2323
  ["Other"]  [2]:  ˽new˽
      2 Captures:  ˽new˽
    ["Key"]  [3]:  someword
  3 Captures:  someword

시각적으로 일치하는 내용은 다음과 같습니다.

여기에 이미지 설명을 입력하십시오

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.