• Login
Community
  • Login

deplace a block to an other place

Scheduled Pinned Locked Moved Help wanted · · · – – – · · ·
27 Posts 7 Posters 17.9k Views
Loading More Posts
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • P
    Pouemes44
    last edited by Jun 24, 2017, 10:12 AM

    Hello
    do you think that its possible to move a block not to the bottom but to the top?
    i dont succeed
    i mean that in this example, how to move <img etc… and …style=“display:none;”></div> just before <noscript class"text" lang=“example”>

    1.html
    <noscript class"text" lang=“example”>
    line1
    line2
    line3
    line4
    </noscript>
    some text…
    etc…
    etc
    <img… and …style=“display:none;”></div>

    2.html
    <noscript class"text" lang=“otherexample”>
    otherline1
    otherline2
    otherline3
    otherline4
    </noscript>
    othersome text…
    etc…
    etc etc
    <img… other and …style=“display:none;”></div>

    1 Reply Last reply Reply Quote 0
    • G
      guy038
      last edited by guy038 Jun 24, 2017, 1:40 PM Jun 24, 2017, 1:38 PM

      Hello, @pouemes44, and All,

      Here is, below, the general method in order to switch two consecutive blocks of text, separated, or not, by some stuff text

      So let’s start with the example text, below :

      bla
      bla
      bla
      Block 1
      of
      some
      text
      End block
      bla bla
      bla bla
      bla bla
      bla bla
      Block 2
      with some
      other text
      End block
      bla bla bla
      bla bla bla
      bla bla bla
      

      To correctly determine the limits of your block of text, whatever it is, you, necessarily, need to know :

      • The location of the beginning of your block. In our example, I suppose that it’s the regex ^Block \d+

      • The location of the end of your block. In our case, I suppose it’s the string End block

      IMPORTANT : In our example, the second block has the same limits as Block 1, but it could, perfectly, have some other limit definitions !

      So, from the above definitions, we can build the regex S/R, below :

      SEARCH (?s)(^Block \d+.+?End block)(.*?)(^Block \d+.+?End block)

      REPLACE \3\2\1

      Notes :

      • The leading (?s) modifier means that the special dot character represents, absolutely, any single character. Now :

      • The first part, (^Block \d+.+?End block, represents a complete individual block of text, stored as group 1

      • The third part, (^Block \d+.+?End block), stands, again, for an other complete block of text, stored as group 3

      • The middle part, (.*?), is the shortest range, even empty, of any character, between these two consecutive blocks of text

      • In replacement, we just switch the group 1 and 3, with group 2 standing as a pivot

      And, after a click on the Replace All button, you should get the expected text , below :

      bla
      bla
      bla
      Block 2
      with some
      other text
      End block
      bla bla
      bla bla
      bla bla
      bla bla
      Block 1
      of
      some
      text
      End block
      bla bla bla
      bla bla bla
      bla bla bla
      

      Just note that, if the two blocks are strictly consecutive, without the bla bla lines, as below :

      bla
      bla
      bla
      Block 1
      of
      some
      text
      End block
      Block 2
      with some
      other text
      End block
      bla bla bla
      bla bla bla
      bla bla bla
      

      We still get the correct modified text :

      bla
      bla
      bla
      Block 2
      with some
      other text
      End block
      Block 1
      of
      some
      text
      End block
      bla bla bla
      bla bla bla
      bla bla bla
      

      Now, Pouemes44, let’s apply this general method to your particular problem :

      The general template, of your first block, is :

      <noscript......
      ......
      ......
      ......
      ......
      </noscript>
      

      The general template, of your second block, is :

      <img.........
      .......
      .......
      .......
      style="display:none;"></div>
      

      Therefore, the corresponding regex S/R, in your case, is, obviously :

      SEARCH (?s)(^<noscript.+?</noscript>)(.*?)(^<img.+?style="display:none;"></div>)

      REPLACE \3\2\1

      So, considering your example, below :

      1.html
      <noscript class"text" lang="example">
      line1
      line2
      line3
      line4
      </noscript>
      some text…
      etc…
      etc
      <img… and …style="display:none;"></div>
      
      2.html
      <noscript class"text" lang="otherexample">
      otherline1
      otherline2
      otherline3
      otherline4
      </noscript>
      othersome text…
      etc…
      etc etc
      <img… other and …style="display:none;"></div>
      

      After performing the above S/R, you’ll get the modified text, as expected to :

      1.html
      <img… and …style="display:none;"></div>
      some text…
      etc…
      etc
      <noscript class"text" lang="example">
      line1
      line2
      line3
      line4
      </noscript>
      
      2.html
      <img… other and …style="display:none;"></div>
      othersome text…
      etc…
      etc etc
      <noscript class"text" lang="otherexample">
      otherline1
      otherline2
      otherline3
      otherline4
      </noscript>
      

      Et voilà !!

      Best Regards,

      guy038

      P.S. : Beware that, on our NodeBB site, text, containing starting and ending usual simple and double quotes, are changed into their Unicode equivalents, below :

      • Starting simple quote ‘, of Unicode code-point \x{2018}, instead of the single quote sign ' ( x{0027 )

      • Ending simple quote ’, of Unicode code-point \x{2019}, instead of the single quote sign ' ( x{0027 )

      • Starting double quote “, of Unicode code-point \x{201C}, instead of the double quote sign " ( x{0022 )

      • Ending double quote ”, of Unicode code-point \x{201D}, instead of the double quote sign " ( x{0022 )

      Notes :

      • For ANSI encoded texts, to avoid the nasty message Find: Invalid regular expression, the **correct regex syntaxes are, respectively, \x91, \x92, \x93 and \x94

      BTW :

      • Remember that the \x{####} regex syntax can be used :

        • For search of a true ASCII character, between \x{0000} and \x{007F}, in ANSI encoded files

        • For search of any Unicode character, between \x{0000} and \x{FFFF}, in UNICODE encoded files

      • Remember that the \x{##} regex syntax can be used :

        • For search of a true ASCII character, between \x{00} and \x{7F}, in ANSI encoded files

        • For search of any Unicode character, between \x{00} and \x{FF}, in UNICODE encoded files

      • To end with, remember that the \x## regex syntax can be used :

        • For search of any Unicode character, between \x00 and \xFF, either, in UNICODE or ANSI encoded files
      1 Reply Last reply Reply Quote 0
      • P
        Pouemes44
        last edited by Jun 25, 2017, 11:25 AM

        a great thanks guy
        that was this part (.*?) i missed

        1 Reply Last reply Reply Quote 0
        • P
          Pouemes44
          last edited by Jun 25, 2017, 11:26 AM

          i have an other question
          if i search (?s)(<h1.+?</h1>\R) i got a result in my file

          but if i search (?s)(<a.+?</a>\R) to get <a href=“mypage.htm” title=page">page</a> i got nothing why? what is wrong?

          1 Reply Last reply Reply Quote 0
          • G
            guy038
            last edited by Jun 28, 2017, 8:22 PM

            Hello, @pouemes44,

            • In the regex (?s)(^Block \d+.+?End block)(.*?)(^Block \d+.+?End block), of my previous post, the part (.*?) represents the shortest range of characters, even empty, stored as group 2, between the two consecutive blocks of text, that are to be swapped !

            Now, if we consider the HTML example text, below :

            <td height="15">
                <font size="2" color="black" face="arial, verdana"><b>Lire un message / dossier : Reçus</b></font> 
            </td>
            
            <td height="15">
                <font size="2" color="black" face="arial, verdana"><b>Lire un message / dossier : Reçus</b></font> 
            </td>
            

            Beware about the two different behaviours :

            • The regex (?s)<td.+</td> looks for the largest range of characters .+, between the strings <td and </td> => It matches all the text, at once

            • The regex (?s)<td.+?</td> looks for the shortest range of characters .+?, between the strings <td and </td> => it matches, successively, each block <td…</td>


            Now, regarding your HTML text :

            <a href=“mypage.htm” title=page">page</a>
            

            I suppose that you do NOT get a match, using the regex (?s)(<a.+?</a>\R), because, probably, it’s the last line of your current file, which is NOT followed by any End of line character !

            Indeed, in that case, the ending part \R cannot match anything. So the overall match fails :-((

            Two solutions :

            • Use the regex (?s)(<a.+?</a>\R?). With that syntax, the \R part is optional

            • Add a line break to this last line !

            For a better visualization of the End of line characters, just click on the ¶ icone

            Cheers,

            guy038

            1 Reply Last reply Reply Quote 0
            • P
              Pouemes44
              last edited by Jul 2, 2017, 6:16 AM

              Hello Guy
              i just see your answer
              a great thanks, yes work with (?s)(<a.+?</a>\R?)
              a real thanks for all your explanations, i already succeed to do wonderful things with them.

              1 Reply Last reply Reply Quote 0
              • G
                guy038
                last edited by guy038 Jul 2, 2017, 12:37 PM Jul 2, 2017, 12:06 PM

                Hi, All,

                I’m back for additional information, about lazy, greedy and possessive quantifiers. it’s fundamental to, correctly, understand the differences, between these 3 types of quantifiers !

                So, let’s consider the simple text 12345ABCDE, in a new tab

                How the regex engine interprets, for instance, the regex \w{1,10}[A-Z]{5}, with the greedy quantifier {1,10} ?. Well :

                • It, first, tries to match the LONGEST range of \w => 10 Word characters. But, the part [A-Z]{5} CANNOT match anything

                • Then, it backtracks and tries the first 9 Words characters. Again, the part [A-Z]{5} does NOT match the E letter

                • Then, it backtracks and tries the first 8 Words characters. Again, the part [A-Z]{5} does NOT match the DE letters

                • Then, it backtracks and tries the first 7 Words characters. Again, the part [A-Z]{5} does NOT match the CDE letters

                • Then, it backtracks and tries the first 6 Words characters. Again, the part [A-Z]{5} does NOT match the BCDE letters

                • Then, it backtracks and tries the first 5 Words characters. This time, the part [A-Z]{5} DOES match the ABCDE letters

                => After the backtracking phase, all the text is matched and selected !


                Now, how the regex engine interprets the regex \w{1,10}?[A-Z]{5}, with the lazy quantifier {1,10}? ?

                • It, first, tries to match the SHORTEST range of \w => 1 Word character. But, the part [A-Z]{5} CANNOT match the 2345ABCDE string

                • Then, it backtracks and tries the first 2 Words characters. Again, the part [A-Z]{5} does NOT match the 345ABCDE string

                • Then, it backtracks and tries the first 3 Words characters. Again, the part [A-Z]{5} does NOT match the 45ABCDE string

                • Then, it backtracks and tries the first 4 Words characters. Again, the part [A-Z]{5} does NOT match the 5ABCDE string

                • Then, it backtracks and tries the first 5 Words characters. This time, the part [A-Z]{5} DOES match the ABCDE letters

                => After the backtracking phase, all the text is matched and selected !

                Note : Instead of the English werb backtrack, the verb fortrack would be more adapted ! Sorry, English isn’t my mother tongue !


                Finally, how the regex engine interprets the regex \w{1,10}+[A-Z]{5}, with the possessive quantifier {1,10}+ ?

                • It, first, tries to match the LONGEST range of \w => 10 Word characters. But, the part [A-Z]{5} CANNOT match anything

                • Now, the normal process would be to backtrack. But this action is forbidden, due to the possessive quantifier ! In other words, once a match has been found, for the first part \w{1,10}+, the following parts of the regex must match the remaining of the text. But, as the first regex part have consumed all the text, the part [A-Z]{5} will NEVER match anything !
                  So, the overall match fails and you get the normal message Find: Can’t find the text “\w{1,10}+[A-Z]{5}”


                Using, again, the same example 12345ABCDE, in a new tab, it’s easy to verify that :

                • The regex \w{1,10} matches the longest Word characters range => The whole string 12345ABCDE is matched

                • The regex \w{1,10}? matches the shortest Word characters range => The 1 Word character is matched, then the 2 digit and so on…

                • The regex \w{1,10}+ matches the longest Word characters range => The whole string 12345ABCDE is matched, too !


                So, to sum up, here is, below, a list of all the quantifiers :

                    GREEDY     quantifiers   :    *  ( = {0,} )       + ( = {1,} )      ?  ( = {0,1} )      {n}        {n,}        {m,n}
                
                    LAZY       quantifiers   :    *? ( = {0,}? )     +? ( = {1,}? )     ?? ( = {0,1}? )     {n}?       {n,}?       {m,n}?
                
                    POSSESSIVE quantifiers   :    *+ ( = {0,}+ )     ++ ( = {1,}+ )     ?+ ( = {0,1}+ )     {n}+       {n,}+       {m,n}+
                

                Remark : The two {n}? and {n}+ syntaxes, although correct, are useless, as the syntax {n} could be qualified as an EXACT quantifier !

                Best Regards,

                guy038

                1 Reply Last reply Reply Quote 0
                21 out of 27
                • First post
                  21/27
                  Last post
                The Community of users of the Notepad++ text editor.
                Powered by NodeBB | Contributors