2009-10-11 5 views
-1

문자열로 끝나는 줄 ("복사본") &을 그 줄 앞에 오는 숫자를 기준으로 정렬해야하는 그리스 몽키 스크립트를 작성하고 싶습니다.자바 스크립트/정규식을 사용하여 웹 페이지의 줄 정렬

나는이 정규식을 포함한다고 가정의 I는, 불행하게도 바로 BR/태그를 테이블을 사용하지 않는 수정 찾고 있어요 페이지 : 그래서 일치하는 문자열이없는

http://www.publishersweekly.com/article/CA6591208.html

(선는 것이다 무시 되십시오.)

나를 시작하게하는 데 도움이되는 정보에 감사드립니다.

답변

0

내가하는 일이 무엇인지 분명하지 않습니다. 여기에 질문을 게시 할 때 실제 데이터를 게시 (일부분)하고 정확히 일치하려는 대상을 명확히 나타내시기 바랍니다.

하지만 정규식을 거의 사용하지 않는 이유는 무엇입니까? 주제를 조금 공부하면, 정규식은 당신이 생각하고있는 것을 만드는 어떤 마법 도구가 아니라는 것을 곧 알게 될 것입니다. 정규식은 어떤 방식 으로든 정렬 할 수 없습니다. 단순히 텍스트와 일치합니다.

이 우수한 온라인 자원에서보세요 :

그리고 읽은 후에 당신이 당신의 문제에 대한 정규식 솔루션이 적절하다고 생각하는 경우, 귀하의 질문에 정교 주시기 내가 I를 확신, 또는 http://www.regular-expressions.info/ 다른 누군가가 당신에게 손을 댈 수 있습니다.

행운을 빈다.

+0

감사합니다. 정규식이 정렬되지 않는다는 것을 알고 있습니다. 그러나 일치하는 문자열을 가진 줄을 식별하고 그 줄 앞에 오는 숫자를 추출하는 것이 유용 할 거라고 생각했습니다.

데이터에 대한 내 설명이 매우 분명하다고 생각했습니다. 어떤 사건의 샘플도 있습니다 :

산타 클로스 Rachael Hale (Little, Brown/LB Kids, $ 6.99). 125,000 부.
수잔 콜린스 (Scholastic Press, $ 17.99)의 기아 게임. 200,000 부.
너무 많은 장난감 David Shannon (Scholastic/Blue Sky, $ 16.99). 150,000 부.

원하는 출력은 첫 번째 줄을 맨 아래로 이동시킵니다. – user189880

+0

좋아요, 나는 당신이 정규식을 분류 할 수있을 거라 생각한 인상을 받았습니다. 나에게 데이터에 대한 설명이 명확하지 않은 경우 명확한 설명을 요구하지 않았다. 그러나 베드로가 이해 한 것 같습니다. –

2

대부분의 경우 HTML과 RegEx가 함께 사용되지 않으며 HTML을 구문 분석 할 때 첫 번째 생각은 RegEx가 아니어야합니다.

그러나이 상황에서는 게시자 주간지에서 해당 페이지의 수행 방식이 변경 될 때까지 마크 업은 괜찮아 보이는 것처럼 보입니다. 여기

는 해당 라인을 잡아, 데이터를 추출으로 정렬하고 다시 넣어하는 함수입니다 :
($ j를 jQuery를하다)

function reorderPwList() 
{ 
    var Container = $j('#article span.table'); 

    var TargetLines = /^.+?(\d+(?:,\d{3})*) copies\.<br ?\/?>$/gmi 

    var Lines = Container.html().match(TargetLines); 

    Lines.sort(sortPwCopies); 

    Container.html(Lines.join('\n')); 


    function sortPwCopies() 
    { 
     function getCopyNum() 
     { return arguments[0].replace(TargetLines,'$1').replace(/\D/g,'') } 

     return getCopyNum(arguments[0]) - getCopyNum(arguments[1]); 
    } 
} 


그리고 거기에 사용 된 정규 표현식에 대한 설명 :

^   # start of line 
.+?   # lazy match one or more non-newline characters 
(   # start capture group $1 
    \d+  # match one or more digits (0-9) 
    (?:  # non-capture group 
    ,\d{3} # comma, then three digits 
)*  # end group, repeat zero or more times 
)   # end group $1 
copies\. # literal text, with . escaped 
<br ?\/?> # match a br tag, with optional space or slash just in case 
$   # end of line 


정규식 플래그 gmi가 사용되는, g lobal, m ulti- 위해 -은 ('복사'전과 'BR'후 유효 사람 만의 공간 가독성을 위해, 나는 그룹을 들여 쓰기했습니다.) 회선 모드, 대소 문자 구분 i nsensitive matching.



< OLD 답변> 당신은 당신이 (DOM/jQuery를 사용하여)에서보고 싶은 텍스트 만 추출하면

, 당신은 다음에 전달할 수 있습니다 함수를 사용하여 관련 정보를 정렬 할 수있는 형식으로 변환합니다.

function makeSortable(Text) 
{ 
    // Mark sortable lines and put number before main content. 
    Text = Text.replace 
     (/^(.*)([\d,]+) copies\.<br \/>/gm 
     , "SORT ME$2 $1" 
     ); 

    // Remove anything not marked for sorting. 
    Text = Text.replace(/^(?!SORT ME).*$/gm , ''); 

    // Remove blank lines. 
    Text = Text.replace(/\n{2,}/g , '\n'); 

    // Remove sort token. 
    Text = Text.replace(/SORT ME/g , ''); 

    return Text; 
} 


그러면 숫자가 올바르게 정렬되도록 정렬 함수가 필요할 것입니다. 표준 JS array.sort 메서드는 텍스트를 정렬하고 20,000 앞에 100,000을 넣습니다.

/^(.*)([\d,]+) copies\.<br \/>/gm 

/.../gm a regex with global-match and multi-line modes 
^   matches start of line 
(.*)  capture to $1, any char (except newline), zero or more times 
([\d,]+) capture to $2, any digit or comma, one or more times 
copies literal text 
\.<br \/> literal text, with . and/escaped (they would be special otherwise) 


/^(?!SORT ME).*$/gm 

/.../gm  again, enable global and multi-line 
^   match start of line 
(?!SORT ME) a negative lookahead, fails the match if text 'SORT ME' is after it 
.*   any char (except newline), zero or more times 
$   end of line 


/\n{2,}/g 

\n{2,} a newline character, two or more times 
:


여기 아, 그리고 여기에 사용되는 정규 표현식에 대한 간단한 설명입니다/OLD 답변 0

<>

+0

나는 이것이 최선의 해결책이라고 확신하지 못한다. 그러나, regexp에 대한 상세한 설명은 +1 –

+0

철저한 설명에 감사드립니다, Peter. 나는 이것들과 함께 일할 것이고 그것이가는 것을 볼 것이다. – user189880

+0

저스틴, 저도 동의합니다 - 뒤에서 한 것처럼 보입니다 :/stereofrog의 적절한 회선 선택 방법이 좀 더 합리적인 방법입니다 (그의 서식은 매우 까다 롭지 만). –

1

이 같은 시작할 수 있습니다 (다만 불을 지르고 콘솔에 CopyPaste에) 링크에 대한

// where are the things 
    var elem = document.getElementById("article"). 
     getElementsByTagName("span")[1]. 
     getElementsByTagName("span")[0]; 

    // extract lines into array 
    var lines = [] 
    elem.innerHTML.replace(/.+?\d+\s+copies\.\s*<br>/g, 
     function($0) { lines.push($0) }); 

    // sort an array 

//  lines.sort(function(a, b) { 
//   var ma = a.match(/(\d+),(\d+)\s+copies/); 
//   var mb = b.match(/(\d+),(\d+)\s+copies/); 
// 
//   return parseInt(ma[1] + ma[2]) - 
//    parseInt(mb[1] + mb[2]); 

      lines.sort(function(a, b) { 
       function getNum(p) { 
        return parseInt(
          p.match(/([\d,]+)\s+copies/)[1].replace(/,/g, "")); 
       } 
       return getNum(a) - getNum(b); 
    }) 

    // put it back 
    elem.innerHTML = lines.join(""); 
+0

와우, 매우 매끄럽다. 제목을 내림차순으로 가져 오는 데 line - line.reverse()를 추가했습니다. 내가 알아챈 유일한 문제는 인쇄물이 999,999 (예 :, "1,300,000 카피")가 올바르게 처리되지 않습니다. – user189880

관련 문제