How to invert the regular expression group capture logic?
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
add a comment |
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
You could perhaps instantiate your RegEx object withRegexOptions.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
add a comment |
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
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
c# python .net regex perl
asked Nov 12 '18 at 21:37
JezJez
11.8k1881152
11.8k1881152
You could perhaps instantiate your RegEx object withRegexOptions.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
add a comment |
You could perhaps instantiate your RegEx object withRegexOptions.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
add a comment |
2 Answers
2
active
oldest
votes
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)
add a comment |
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).
add a comment |
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
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
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
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)
add a comment |
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)
add a comment |
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)
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)
answered Nov 12 '18 at 21:44
elgonzoelgonzo
4,49921323
4,49921323
add a comment |
add a comment |
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).
add a comment |
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).
add a comment |
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).
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).
edited Nov 13 '18 at 2:20
answered Nov 13 '18 at 1:05
zdimzdim
32.3k32041
32.3k32041
add a comment |
add a comment |
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.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
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
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
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
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