0 added
0 removed
Original
2026-01-01
Modified
2026-02-21
1
<p>Regex supports searching by condition. This is probably one of the most complex constructs that exists in regex and is not supported in JavaScript, or many other programming languages. In some languages, you need to consider the specifics of its implementation, for example, Python supports conditional searching using grouping with backreferencing and with named groups.</p>
1
<p>Regex supports searching by condition. This is probably one of the most complex constructs that exists in regex and is not supported in JavaScript, or many other programming languages. In some languages, you need to consider the specifics of its implementation, for example, Python supports conditional searching using grouping with backreferencing and with named groups.</p>
2
<p>It resembles a ternary operator from programming languages and looks like this: (?ifthen|else).</p>
2
<p>It resembles a ternary operator from programming languages and looks like this: (?ifthen|else).</p>
3
<p>Let's look at an example of how it works:</p>
3
<p>Let's look at an example of how it works:</p>
4
<p>/(?(?<=a)m|p)/</p>
4
<p>/(?(?<=a)m|p)/</p>
5
<p>mam,pap</p>
5
<p>mam,pap</p>
6
<p>We see outside brackets with ?, and inside are two separate expressions:</p>
6
<p>We see outside brackets with ?, and inside are two separate expressions:</p>
7
<ul><li>The first is the condition (?<=a), which checks if the character on the left matches a.</li>
7
<ul><li>The first is the condition (?<=a), which checks if the character on the left matches a.</li>
8
<li>Next comes the alternative, and we choose between m and p depending on whether the condition worked or not.</li>
8
<li>Next comes the alternative, and we choose between m and p depending on whether the condition worked or not.</li>
9
</ul><p>You can describe this construction as follows: “Find all instances of m that are preceded either by an a or by a p preceded by no a".</p>
9
</ul><p>You can describe this construction as follows: “Find all instances of m that are preceded either by an a or by a p preceded by no a".</p>
10
<p>Let's break down the search in our string character by character:</p>
10
<p>Let's break down the search in our string character by character:</p>
11
<ul><li>the condition is checked to see if the current character is m and if a comes before it. Since the condition hasn't been met, it'll attempt to extract p, which is also not the current character;</li>
11
<ul><li>the condition is checked to see if the current character is m and if a comes before it. Since the condition hasn't been met, it'll attempt to extract p, which is also not the current character;</li>
12
<li>the second a doesn't fit the conditions, the missing substring ma, then m,pap is checked;</li>
12
<li>the second a doesn't fit the conditions, the missing substring ma, then m,pap is checked;</li>
13
<li>the third character m corresponds to m, previously was a -<em>match</em>was found;</li>
13
<li>the third character m corresponds to m, previously was a -<em>match</em>was found;</li>
14
<li>the fourth character , does not fit the conditions, the missing substring mam,, then it is checked pap;</li>
14
<li>the fourth character , does not fit the conditions, the missing substring mam,, then it is checked pap;</li>
15
<li>the fifth character p does not correspond to am, but corresponds to p - a second<em>match</em>is found;</li>
15
<li>the fifth character p does not correspond to am, but corresponds to p - a second<em>match</em>is found;</li>
16
<li>he sixth character a again triggers the check for the next character to match m;</li>
16
<li>he sixth character a again triggers the check for the next character to match m;</li>
17
<li>the seventh character p fails the m-check.</li>
17
<li>the seventh character p fails the m-check.</li>
18
</ul><p>That's how we got two matches in the string as a result of the conditional search.</p>
18
</ul><p>That's how we got two matches in the string as a result of the conditional search.</p>