Regular Expression Pattern Modifiers for ECMAScript
47
stars
38
commits
HTML
primary language
Oct 8, 2024
updated
Stage: 4
Champion: Ron Buckton (@rbuckton)
For detailed status of this proposal see TODO, below.
One common capability amongst the majority of regular expression engines that is commonly used by parsers, syntax highlighters, and other tools is the capability to control a subset of regular expression flags such as:
i — Ignore Casem — Multilines — Single-line (a.k.a. "dot all")x — Extended mode (see https://github.com/rbuckton/proposal-regexp-x-mode)Modifiers are especially helpful when regular expressions are defined in a context where executable code cannot be evaluated, such as a JSON configuration file or TextMate tmLanguage grammar file.
As part of this proposal, we will investigate each existing (and future-proposed) RegExp flag to determine whether they are feasible to used as modifiers.
See https://rbuckton.github.io/regexp-features/features/modifiers.html for additional information.
Modifiers allow you to change the currently active RegExp flags within a subexpression.
(?imsx-imsx:subexpression) — Sets or unsets (using -) the specified RegExp flags for the subexpression.(?imsx-imsx) — Sets or unsets (using -) the specified RegExp flags starting at the current position until the next closing ) or the end of the pattern.NOTE: Certain flags cannot be modified mid-expression. These currently include
g(global),y(sticky),u(unicode), andd(hasIndices).
NOTE: The actual supported flags will be determined on a case-by-case basis. See #1.
NOTE: This has no conflicts with existing syntax, as ECMAScript currently produces an error for this syntax in both
uand non-umodes.
NOTE: The "self-bounded" form (
(?imsx-imsx:subexpression)) advanced to Stage 2 on December 15th, 2021.
NOTE: The "unbounded" form (
(?imsx-imsx)) is no longer being considered as part of this proposal as of December 15th, 2021.
const re1 = /^[a-z](?-i:[a-z])$/i;
re1.test("ab"); // true
re1.test("Ab"); // true
re1.test("aB"); // false
const re2 = /^(?i:[a-z])[a-z]$/;
re2.test("ab"); // true
re2.test("Ab"); // true
re2.test("aB"); // false
The following is a high-level list of tasks to progress through each stage of the TC39 proposal process:
38 commits
HTML
96.7%
JavaScript
3.3%
Regular Expression Pattern Modifiers for ECMAScript
47
stars
38
commits
HTML
primary language
Oct 8, 2024
updated
Stage: 4
Champion: Ron Buckton (@rbuckton)
For detailed status of this proposal see TODO, below.
One common capability amongst the majority of regular expression engines that is commonly used by parsers, syntax highlighters, and other tools is the capability to control a subset of regular expression flags such as:
i — Ignore Casem — Multilines — Single-line (a.k.a. "dot all")x — Extended mode (see https://github.com/rbuckton/proposal-regexp-x-mode)Modifiers are especially helpful when regular expressions are defined in a context where executable code cannot be evaluated, such as a JSON configuration file or TextMate tmLanguage grammar file.
As part of this proposal, we will investigate each existing (and future-proposed) RegExp flag to determine whether they are feasible to used as modifiers.
See https://rbuckton.github.io/regexp-features/features/modifiers.html for additional information.
Modifiers allow you to change the currently active RegExp flags within a subexpression.
(?imsx-imsx:subexpression) — Sets or unsets (using -) the specified RegExp flags for the subexpression.(?imsx-imsx) — Sets or unsets (using -) the specified RegExp flags starting at the current position until the next closing ) or the end of the pattern.NOTE: Certain flags cannot be modified mid-expression. These currently include
g(global),y(sticky),u(unicode), andd(hasIndices).
NOTE: The actual supported flags will be determined on a case-by-case basis. See #1.
NOTE: This has no conflicts with existing syntax, as ECMAScript currently produces an error for this syntax in both
uand non-umodes.
NOTE: The "self-bounded" form (
(?imsx-imsx:subexpression)) advanced to Stage 2 on December 15th, 2021.
NOTE: The "unbounded" form (
(?imsx-imsx)) is no longer being considered as part of this proposal as of December 15th, 2021.
const re1 = /^[a-z](?-i:[a-z])$/i;
re1.test("ab"); // true
re1.test("Ab"); // true
re1.test("aB"); // false
const re2 = /^(?i:[a-z])[a-z]$/;
re2.test("ab"); // true
re2.test("Ab"); // true
re2.test("aB"); // false
The following is a high-level list of tasks to progress through each stage of the TC39 proposal process:
38 commits
HTML
96.7%
JavaScript
3.3%