How to invert the regular expression group capture logic?












0















To create a capturing group in a regex you use (match) and you prefix it with ?: to make it non-capturing, like (?:match). The thing is, in any kind of complicated regular expression I find myself wanting to create far more non-capturing groups than capturing ones, so I'd like to reverse this logic and only capture groups beginning with ?: (or whatever). How can I do this? I mainly use regular expressions with .NET, but I wouldn't mind answers for other languages with regular expressions like Perl, PHP, Python, JavaScript, etc.










share|improve this question























  • You could perhaps instantiate your RegEx object with RegexOptions.ExplicitCapture (docs.microsoft.com/en-gb/dotnet/api/…)

    – elgonzo
    Nov 12 '18 at 21:40













  • @elgonzo That looks good, if you put it as an answer I can accept.

    – Jez
    Nov 12 '18 at 21:41
















0















To create a capturing group in a regex you use (match) and you prefix it with ?: to make it non-capturing, like (?:match). The thing is, in any kind of complicated regular expression I find myself wanting to create far more non-capturing groups than capturing ones, so I'd like to reverse this logic and only capture groups beginning with ?: (or whatever). How can I do this? I mainly use regular expressions with .NET, but I wouldn't mind answers for other languages with regular expressions like Perl, PHP, Python, JavaScript, etc.










share|improve this question























  • You could perhaps instantiate your RegEx object with RegexOptions.ExplicitCapture (docs.microsoft.com/en-gb/dotnet/api/…)

    – elgonzo
    Nov 12 '18 at 21:40













  • @elgonzo That looks good, if you put it as an answer I can accept.

    – Jez
    Nov 12 '18 at 21:41














0












0








0








To create a capturing group in a regex you use (match) and you prefix it with ?: to make it non-capturing, like (?:match). The thing is, in any kind of complicated regular expression I find myself wanting to create far more non-capturing groups than capturing ones, so I'd like to reverse this logic and only capture groups beginning with ?: (or whatever). How can I do this? I mainly use regular expressions with .NET, but I wouldn't mind answers for other languages with regular expressions like Perl, PHP, Python, JavaScript, etc.










share|improve this question














To create a capturing group in a regex you use (match) and you prefix it with ?: to make it non-capturing, like (?:match). The thing is, in any kind of complicated regular expression I find myself wanting to create far more non-capturing groups than capturing ones, so I'd like to reverse this logic and only capture groups beginning with ?: (or whatever). How can I do this? I mainly use regular expressions with .NET, but I wouldn't mind answers for other languages with regular expressions like Perl, PHP, Python, JavaScript, etc.







c# python .net regex perl






share|improve this question













share|improve this question











share|improve this question




share|improve this question










asked Nov 12 '18 at 21:37









JezJez

11.8k1881152




11.8k1881152













  • You could perhaps instantiate your RegEx object with RegexOptions.ExplicitCapture (docs.microsoft.com/en-gb/dotnet/api/…)

    – elgonzo
    Nov 12 '18 at 21:40













  • @elgonzo That looks good, if you put it as an answer I can accept.

    – Jez
    Nov 12 '18 at 21:41



















  • You could perhaps instantiate your RegEx object with RegexOptions.ExplicitCapture (docs.microsoft.com/en-gb/dotnet/api/…)

    – elgonzo
    Nov 12 '18 at 21:40













  • @elgonzo That looks good, if you put it as an answer I can accept.

    – Jez
    Nov 12 '18 at 21:41

















You could perhaps instantiate your RegEx object with RegexOptions.ExplicitCapture (docs.microsoft.com/en-gb/dotnet/api/…)

– elgonzo
Nov 12 '18 at 21:40







You could perhaps instantiate your RegEx object with RegexOptions.ExplicitCapture (docs.microsoft.com/en-gb/dotnet/api/…)

– elgonzo
Nov 12 '18 at 21:40















@elgonzo That looks good, if you put it as an answer I can accept.

– Jez
Nov 12 '18 at 21:41





@elgonzo That looks good, if you put it as an answer I can accept.

– Jez
Nov 12 '18 at 21:41












2 Answers
2






active

oldest

votes


















3














If you want to avoid the clumsiness of (?: ) and turn ( ) groups into non-capturing groups, use the RegexOptions.ExplicitCapture option. Only named groups ((?<name>subexpression)) will be captured if this option is being used.



However, you cannot turn non-capturing groups (?: ) into capturing groups, unfortunately.



The RegEx constructor as well as other methods from the RegEx class accept RegexOptions flags.



For example:



Regex.Matches(input, pattern, RegexOptions.ExplicitCapture)





share|improve this answer































    3














    In any language that supports named capture groups you can simply use them for what you want captured, and ignore the numbered ones.



    my $string = q(Available from v5.10 in Perl.);

    $string =~ /([A-Z].+?)(?<v>[0-9.]+)s+(.*?)./;

    say "Version: $+{v}";


    After the regex the capture is available in %+ hash, inside the regex in k<name> or g{name}.



    The downside is that you still capture all that other stuff (what hurts efficiency a little), while the upside is that you still capture all that other stuff (what helps flexibility, if some of it turns needed).






    share|improve this answer

























      Your Answer






      StackExchange.ifUsing("editor", function () {
      StackExchange.using("externalEditor", function () {
      StackExchange.using("snippets", function () {
      StackExchange.snippets.init();
      });
      });
      }, "code-snippets");

      StackExchange.ready(function() {
      var channelOptions = {
      tags: "".split(" "),
      id: "1"
      };
      initTagRenderer("".split(" "), "".split(" "), channelOptions);

      StackExchange.using("externalEditor", function() {
      // Have to fire editor after snippets, if snippets enabled
      if (StackExchange.settings.snippets.snippetsEnabled) {
      StackExchange.using("snippets", function() {
      createEditor();
      });
      }
      else {
      createEditor();
      }
      });

      function createEditor() {
      StackExchange.prepareEditor({
      heartbeatType: 'answer',
      autoActivateHeartbeat: false,
      convertImagesToLinks: true,
      noModals: true,
      showLowRepImageUploadWarning: true,
      reputationToPostImages: 10,
      bindNavPrevention: true,
      postfix: "",
      imageUploader: {
      brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
      contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
      allowUrls: true
      },
      onDemand: true,
      discardSelector: ".discard-answer"
      ,immediatelyShowMarkdownHelp:true
      });


      }
      });














      draft saved

      draft discarded


















      StackExchange.ready(
      function () {
      StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53270459%2fhow-to-invert-the-regular-expression-group-capture-logic%23new-answer', 'question_page');
      }
      );

      Post as a guest















      Required, but never shown

























      2 Answers
      2






      active

      oldest

      votes








      2 Answers
      2






      active

      oldest

      votes









      active

      oldest

      votes






      active

      oldest

      votes









      3














      If you want to avoid the clumsiness of (?: ) and turn ( ) groups into non-capturing groups, use the RegexOptions.ExplicitCapture option. Only named groups ((?<name>subexpression)) will be captured if this option is being used.



      However, you cannot turn non-capturing groups (?: ) into capturing groups, unfortunately.



      The RegEx constructor as well as other methods from the RegEx class accept RegexOptions flags.



      For example:



      Regex.Matches(input, pattern, RegexOptions.ExplicitCapture)





      share|improve this answer




























        3














        If you want to avoid the clumsiness of (?: ) and turn ( ) groups into non-capturing groups, use the RegexOptions.ExplicitCapture option. Only named groups ((?<name>subexpression)) will be captured if this option is being used.



        However, you cannot turn non-capturing groups (?: ) into capturing groups, unfortunately.



        The RegEx constructor as well as other methods from the RegEx class accept RegexOptions flags.



        For example:



        Regex.Matches(input, pattern, RegexOptions.ExplicitCapture)





        share|improve this answer


























          3












          3








          3







          If you want to avoid the clumsiness of (?: ) and turn ( ) groups into non-capturing groups, use the RegexOptions.ExplicitCapture option. Only named groups ((?<name>subexpression)) will be captured if this option is being used.



          However, you cannot turn non-capturing groups (?: ) into capturing groups, unfortunately.



          The RegEx constructor as well as other methods from the RegEx class accept RegexOptions flags.



          For example:



          Regex.Matches(input, pattern, RegexOptions.ExplicitCapture)





          share|improve this answer













          If you want to avoid the clumsiness of (?: ) and turn ( ) groups into non-capturing groups, use the RegexOptions.ExplicitCapture option. Only named groups ((?<name>subexpression)) will be captured if this option is being used.



          However, you cannot turn non-capturing groups (?: ) into capturing groups, unfortunately.



          The RegEx constructor as well as other methods from the RegEx class accept RegexOptions flags.



          For example:



          Regex.Matches(input, pattern, RegexOptions.ExplicitCapture)






          share|improve this answer












          share|improve this answer



          share|improve this answer










          answered Nov 12 '18 at 21:44









          elgonzoelgonzo

          4,49921323




          4,49921323

























              3














              In any language that supports named capture groups you can simply use them for what you want captured, and ignore the numbered ones.



              my $string = q(Available from v5.10 in Perl.);

              $string =~ /([A-Z].+?)(?<v>[0-9.]+)s+(.*?)./;

              say "Version: $+{v}";


              After the regex the capture is available in %+ hash, inside the regex in k<name> or g{name}.



              The downside is that you still capture all that other stuff (what hurts efficiency a little), while the upside is that you still capture all that other stuff (what helps flexibility, if some of it turns needed).






              share|improve this answer






























                3














                In any language that supports named capture groups you can simply use them for what you want captured, and ignore the numbered ones.



                my $string = q(Available from v5.10 in Perl.);

                $string =~ /([A-Z].+?)(?<v>[0-9.]+)s+(.*?)./;

                say "Version: $+{v}";


                After the regex the capture is available in %+ hash, inside the regex in k<name> or g{name}.



                The downside is that you still capture all that other stuff (what hurts efficiency a little), while the upside is that you still capture all that other stuff (what helps flexibility, if some of it turns needed).






                share|improve this answer




























                  3












                  3








                  3







                  In any language that supports named capture groups you can simply use them for what you want captured, and ignore the numbered ones.



                  my $string = q(Available from v5.10 in Perl.);

                  $string =~ /([A-Z].+?)(?<v>[0-9.]+)s+(.*?)./;

                  say "Version: $+{v}";


                  After the regex the capture is available in %+ hash, inside the regex in k<name> or g{name}.



                  The downside is that you still capture all that other stuff (what hurts efficiency a little), while the upside is that you still capture all that other stuff (what helps flexibility, if some of it turns needed).






                  share|improve this answer















                  In any language that supports named capture groups you can simply use them for what you want captured, and ignore the numbered ones.



                  my $string = q(Available from v5.10 in Perl.);

                  $string =~ /([A-Z].+?)(?<v>[0-9.]+)s+(.*?)./;

                  say "Version: $+{v}";


                  After the regex the capture is available in %+ hash, inside the regex in k<name> or g{name}.



                  The downside is that you still capture all that other stuff (what hurts efficiency a little), while the upside is that you still capture all that other stuff (what helps flexibility, if some of it turns needed).







                  share|improve this answer














                  share|improve this answer



                  share|improve this answer








                  edited Nov 13 '18 at 2:20

























                  answered Nov 13 '18 at 1:05









                  zdimzdim

                  32.3k32041




                  32.3k32041






























                      draft saved

                      draft discarded




















































                      Thanks for contributing an answer to Stack Overflow!


                      • Please be sure to answer the question. Provide details and share your research!

                      But avoid



                      • Asking for help, clarification, or responding to other answers.

                      • Making statements based on opinion; back them up with references or personal experience.


                      To learn more, see our tips on writing great answers.




                      draft saved


                      draft discarded














                      StackExchange.ready(
                      function () {
                      StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53270459%2fhow-to-invert-the-regular-expression-group-capture-logic%23new-answer', 'question_page');
                      }
                      );

                      Post as a guest















                      Required, but never shown





















































                      Required, but never shown














                      Required, but never shown












                      Required, but never shown







                      Required, but never shown

































                      Required, but never shown














                      Required, but never shown












                      Required, but never shown







                      Required, but never shown







                      Popular posts from this blog

                      Full-time equivalent

                      さくらももこ

                      13 indicted, 8 arrested in Calif. drug cartel investigation