2013-06-18 3 views
2

일반 응용 프로그램을 개발 중이며 해결할 수없는 패턴과 일치해야합니다.정규 표현식의 패턴 일치

입력 문자열이 될 수있다 : 당신이 예에서 볼 수 있듯이

12_B 99-23_9_23 

, 내 문제는 내가 "B 99-23을"이 패턴과 일치 할 때. 구분 기호는 무엇이든 될 수뿐만 아니라 밑줄 (전 12 | B 99-23 | 9 | 23.) 나는이 부분을 변경해야합니다

Regex r = new Regex("^(?< pol>\\w+)_(?< fac>\\w+)_(?< end>\\w+)_(?< op>\\w+)"); 

지금이 내가 가진 것입니다 ... : (?< fac>\\w+) 패턴은 공백, 숫자, 문자를 포함하여 다음 구분 기호 ('_')까지 모두 가져와야합니다.

pol = 12 
fac = B 99-23 
end = 9 
op = 23 

답변

2

이 패턴을 사용해보십시오 : 은 그 때 나는이 결과를해야합니다

^(?< pol>\w+)_(?< fac>[^_]+)_(?< end>\w+)_(?< op>\w+) 

[^_] 비트 '밑줄을 제외하고 아무것도 일치'의미 character class. 구분 기호가 | 인 경우 |은 정규 표현식에서 특수한 의미를 갖기 때문에 (문자 클래스 내에서 이스케이프 할 필요는 없지만) 패턴에 \|을 사용해야합니다. 이처럼 :

new Regex(@"^(?< pol>\w+)\|(?< fac>[^|]+)\|(?< end>\w+)\|(?< op>\w+)"); 
: 보조 노트에

^(?< pol>\w+)\|(?< fac>[^|]+)\|(?< end>\w+)\|(?< op>\w+) 

, 나는 그것이 정규 표현식 패턴을 지정할 때 많은 이스케이프 시퀀스를 입력 할 필요가 없기 때문에 그대로 문자열을 사용하는 것이 훨씬 쉽게 찾을 수 있습니다


그러나이 경우, 당신은 단지 Split를 사용하여 더 나을 수 있습니다

var result = input.Split(new char[] { '_' }, 4); 
// result[0] = 12 
// result[1] = B 99-23 
// result[2] = 9 
// result[3] = 23 
+0

감사합니다! 그러나이 예제에서는 부작용이 없습니다 ... 12 | B 99-23 | 9 | 23 다음 구분 기호까지 일치해야합니다. 위의 예에서와 같은 것입니다 :^나는했습니다 –

+0

아주 좋은 그것을 설명하지 않는 경우 죄송합니다 (+ w \ < pol>?) | (< fac>?) | | (+ w \ < end>?) (+ w \ < op>?) 내 대답을 업데이트하여'|'문자에 사용할 패턴을 포함 시켰습니다. 당신은 "구분 기호는 무엇이든 될 수 있습니다."라고 말했지만, 그건별로 의미가 없습니다. 어떤 구획 문자를 기대합니까? 혼합 된 구분 기호를 처리해야합니까? '12 | B 99_23 | 9 | 23'은 어떻게 일치해야합니까? –

0

설명

일부 문제는 \w도 모든 문자 a-z, 모든 숫자 0-9 및 밑줄 _을 포함한다는 것입니다. 당신의 입력 텍스트가 _ 구분 기호를 사용할 수 있다면 당신은 구분 기호로 언더를 허용하는 요구 사항을 가지고 있기 때문에 다음 \w+ 일치하는 표현이

혼란스러워 할 것이다 그래서 나는 당신이 대신 문자 클래스를 '정의하는 대신 짧은 손 \w을 사용하는 것이 좋습니다 원하는 텍스트와 구분 기호를 모두 좋아합니다.

  • [0-9a-zA-Z]+ 어떤 순서
  • [^a-zA-Z0-9] 이것은 부정 문자 클래스, 그리고 어떤 alphebetical없는 문자 또는 숫자

이 정규식 일치를 일치 하나 이상의 alphebetical 또는 숫자와 일치합니다 모든 값을 가질 수 있으며 다양한 구분 기호를 사용할 수 있습니다.편지 공간 번호 하이픈 번호 :

^(?<pol>[0-9a-zA-Z]+)[^a-zA-Z0-9](?<fac>[0-9a-zA-Z]+\s[0-9a-zA-Z]+-[0-9a-zA-Z]+)[^a-zA-Z0-9](?<end>[0-9a-zA-Z]+)[^a-zA-Z0-9](?<op>[0-9a-zA-Z]+)

enter image description here

그룹

내가 형식이됩니다 분야를 가정하고있어 fac 그룹을 일치합니다.

  • 그룹 0 FAC 2 = 3 = 단, 4 = OP 그러나 화상 POL = 1에서, 전체 매칭 문자열
  • 명명 된 그룹을 생성한다 얻을 것이다. 드로잉 소프트웨어가 혼란을 가져서 죄송합니다. 명명 된 캡처 그룹을 처리하지 못합니다.

C# 코드 예제 :

입력 텍스트

12_B 99-23_9_23 
11_a 11-11_1_11 
22|b 22-22|2|22 
33-c 33-33-3-33 
44,d 44-44,4,44 

코드

using System; 
using System.Text.RegularExpressions; 
namespace myapp 
{ 
    class Class1 
    { 
     static void Main(string[] args) 
     { 
      String sourcestring = "source string to match with pattern"; 
      Regex re = new Regex(@"^(?<pol>[0-9a-zA-Z]+)[^a-zA-Z0-9](?<fac>[0-9a-zA-Z]+\s[0-9a-zA-Z]+-[0-9a-zA-Z]+)[^a-zA-Z0-9](?<end>[0-9a-zA-Z]+)[^a-zA-Z0-9](?<op>[0-9a-zA-Z]+)",RegexOptions.IgnoreCase | RegexOptions.Multiline); 
      MatchCollection mc = re.Matches(sourcestring); 
      int mIdx=0; 
      foreach (Match m in mc) 
      { 
      for (int gIdx = 0; gIdx < m.Groups.Count; gIdx++) 
       { 
       Console.WriteLine("[{0}][{1}] = {2}", mIdx, re.GetGroupNames()[gIdx], m.Groups[gIdx].Value); 
       } 
      mIdx++; 
      } 
     } 
    } 
} 

일치

$matches Array: 
(
    [0] => Array 
     (
      [0] => 12_B 99-23_9_23 
      [1] => 11_a 11-11_1_11 
      [2] => 22|b 22-22|2|22 
      [3] => 33-c 33-33-3-33 
      [4] => 44,d 44-44,4,44 
     ) 

    [pol] => Array 
     (
      [0] => 12 
      [1] => 11 
      [2] => 22 
      [3] => 33 
      [4] => 44 
     ) 


    [fac] => Array 
     (
      [0] => B 99-23 
      [1] => a 11-11 
      [2] => b 22-22 
      [3] => c 33-33 
      [4] => d 44-44 
     ) 


    [end] => Array 
     (
      [0] => 9 
      [1] => 1 
      [2] => 2 
      [3] => 3 
      [4] => 4 
     ) 


    [op] => Array 
     (
      [0] => 23 
      [1] => 11 
      [2] => 22 
      [3] => 33 
      [4] => 44 
     ) 


)