0

요구 사항 : 다음 데이터가 regEX와 일치해야합니다. <H2>Composition<\H2>하나의 고정 패턴 다음에 정규 표현식을 사용하는 다른 패턴이 여러 개 있습니다.

  • Name의 숫자가있을 수 있습니다 후 Name 항상 올 것이라는 점을 고려

    1. $regex 필요 : 나는 이름 1 명 2 명 3 명 4

      일부 조건을 얻을 필요 예를 들어, Composition 다음에는 하나의 패턴이 Name1이거나 두 패턴이 Name1Name2 일뿐입니다.

    2. 적어도 하나의 Name 패턴이 작곡 이후에 존재합니다.
      <H2>Composition</H2> 
      <A href="/generics/levocetrizine-210129">Name 1</A>, 
      <A href="/generics/paracetamol-210459">Name 2(500 mg)</A>, 
      <A href="/generics/phenylephrine-hydrochloride-210494">Name 3</A>, 
      <A href="/generics/ambroxol-hydrochloride-211798">Name 4</A></DIV></DIV></DIV></DIV> 
      

      지금까지, 난 단지 스크립트를 다음을 통해 NameName1 첫번째 얻을 수있을 수 :

    예 "의 구성은 다음 이름 1이 반드시있을 것입니다 존재"같은 정규식해야한다. 내 스크립트는 단순히 "Name"의 나머지 부분을 무시합니다. 즉 위의 경우 Name2, Name3 및 Name4가 출력 결과에서 누락되었습니다.

    [regex]$regex = 
    @' 
    (?s).+?<H2>Composition</H2>.*?href="/generics/.*?">(.*?)</A> 
    '@ 
    
  • +0

    ''의 첫 번째 발생에서 멈추는 지연 연산자'?'를 사용하고 있습니다. –

    +0

    제거하면 마지막 "이름"이 표시됩니다. 위의 경우 Name4 만 해당됩니다. 나는 모든 이름이 필요하다. 이름 1, 이름 2, 이름 3, 이름 4. – Powershel

    +0

    나는 비슷한 것을 할 수 있습니까? 하나의 "작곡"인스턴스 다음에 "이름"인스턴스가 여러 개 이어짐 – Powershel

    답변

    2

    이 문제는 HTML Agility pack에 대해 XPath 식 또는 C#을 사용하면 해결하기가 훨씬 쉽습니다. Regular Expressions are going to be a major pain,이 경우에는 작업을 수행 할 수 있습니다. 이 작은 C#을 조각에서 파워 쉘에

    HtmlDocument doc = new HtmlDocument(); 
    doc.LoadHtml(yourString); 
    
    string xpath = "//H2[contains(text(), 'Composition')]/following-sibling::A[contains(@href, '/generics/']"; 
    
    var nodes = doc.DocumentNode.SelectNodes(xpath); 
    foreach (var node in nodes) 
    { 
        string name = node.InnerText; 
        string uri = node.Attributes["href"].Value; 
    } 
    

    변환 열심히 안 다음 HTML 민첩성 팩

    이 뭔가를 할 것이다.

    Regex를 사용하면 장기적으로 고통이 될 것입니다. HTML 또는 XML과 같은 구조화 된 문서의 구문 분석이나 구문 분석을 의미하지 않습니다. 캡처를

    (?i)<h2>composition</h2>(?:(?:(?!<a).*)<a href="/generics/[^"]+">(?<name>(?!</a).*)</A>)* 
    

    그리고 잡기 위해 .NET 정규식 기능을 사용 :

    당신이 정말로의 끔찍한, 나쁜, 좋지 않은, 끔찍한, 정규식 방법을 이런 식으로 뭔가를 시도하려는 경우

    ([regex]$regex).Match("$content").Groups['name'].Captures