const regex = /^([ ]{6})(- )((?!name)\w+[:](?:[ ]*(?=\n\1[ ]{4}\S)|[ ]*\S.+))((?:\n\1[ ]{2}.+)*?)(?:\n(\1[ ]{2})(name[ ]*[:])((?:[ ]*(?![>|])\S.+\b)|(?:(?:[ ]*[>|])?\n\5[ ]+.+)*))[ ]*$/gm;
// Alternative syntax using RegExp constructor
// const regex = new RegExp('^([ ]{6})(- )((?!name)\\w+[:](?:[ ]*(?=\\n\\1[ ]{4}\\S)|[ ]*\\S.+))((?:\\n\\1[ ]{2}.+)*?)(?:\\n(\\1[ ]{2})(name[ ]*[:])((?:[ ]*(?![>|])\\S.+\\b)|(?:(?:[ ]*[>|])?\\n\\5[ ]+.+)*))[ ]*$', 'gm')
const str = `// YAML Textmate grammar name property hoister
// Moves a later \`name\` key value pair in multi value block definition to the
// top of its
//
// # Notes
// - Indent size is assumed to be 2.
// - Indent level of names being hoisted is controlled by capture group \$1,
// which is later referenced by \$5, the indent level of all other properties
// - Other properties can be hoisted by replacing the two instances of \`name\`
// in the pattern. A couple inputs for simple nested, folded, and literal values
// (immediately after these notes) seem to work.
// - Syntax level comments in captures will probably need to be rearranged after
// applying this, and worst case (especially comments lower indents) break matching
- match: '\\s*(\\,)\\s*'
name:
'Testing': Regex101.Debug.Nested.Name
- match: '\\s*(\\,)\\s*'
name:
'Testing': Regex101.Debug.Nested.Name.TrailingWhitespace
- match: '\\s*(\\,)\\s*'
# Comment
name:
'Testing': Regex101.Debug.Nested.Name.TrailingWhitespace
- match: '\\s*(\\,)\\s*'
name: >
Wow this is a long name?
kind of sus
- match: '\\s*(\\,)\\s*'
name: |
sus2
- name: meta.selector.stylus
match: '\\s*(\\,)\\s*'
- match: \\*
name: meta.selector.stylus
- match: '\\s*(\\&)([a-zA-Z0-9_-]+)\\s*'
captures:
'2':
name: entity.other.attribute-name.parent-selector-suffix.stylus
name: meta.selector.stylus
- match: \\s*(\\&)\\s*
name: meta.selector.stylus
- captures:
'1':
name: punctuation.definition.entity.css
match: '(\\.)[a-zA-Z0-9_-]+'
name: entity.other.attribute-name.class.css
- captures:
'1':
name: punctuation.definition.entity.css
match: '(#)[a-zA-Z][a-zA-Z0-9_-]*'
name: entity.other.attribute-name.id.css
- captures:
'1':
name: punctuation.definition.entity.css
match: >-
(:+)(after|before|content|first-letter|first-line|host|(-(moz|webkit|ms)-)?selection)\\b
name: entity.other.attribute-name.pseudo-element.css
- captures:
'1':
name: punctuation.definition.entity.css
match: >-
(:)((first|last)-child|(first|last|only)-of-type|empty|root|target|first|left|right)\\b
name: entity.other.attribute-name.pseudo-class.css
- captures:
'1':
name: punctuation.definition.entity.css
match: >-
(:)(checked|enabled|default|disabled|indeterminate|invalid|optional|required|valid)\\b
name: entity.other.attribute-name.pseudo-class.ui-state.css
- begin: '((:)not)(\\()'
beginCaptures:
'1':
name: entity.other.attribute-name.pseudo-class.css
'2':
name: punctuation.definition.entity.css
'3':
name: punctuation.section.function.css
end: \\)
endCaptures:
'0':
name: punctuation.section.function.css
patterns:
- include: '#selector'
- captures:
'1':
name: entity.other.attribute-name.pseudo-class.css
'2':
name: punctuation.definition.entity.css
'3':
name: punctuation.section.function.css
'4':
name: constant.numeric.css
'5':
name: punctuation.section.function.css
match: >-
((:)nth-(?:(?:last-)?child|(?:last-)?of-type))(\\()(\\-?(?:\\d+n?|n)(?:\\+\\d+)?|even|odd)(\\))
- match: '((:)dir)\\s*(?:(\\()(ltr|rtl)?(\\)))?'
captures:
'1':
name: entity.other.attribute-name.pseudo-class.css
'2':
name: puncutation.definition.entity.css
'3':
name: punctuation.section.function.css
'4':
name: constant.language.css
'5':
name: punctuation.section.function.css
- match: '((:)lang)\\s*(?:(\\()(\\w+(-\\w+)?)?(\\)))?'
captures:
'1':
name: entity.other.attribute-name.pseudo-class.css
'2':
name: puncutation.definition.entity.css
'3':
name: punctuation.section.function.css
'4':
name: constant.language.css
'6':
name: punctuation.section.function.css
- captures:
'1':
name: punctuation.definition.entity.css
match: '(:)(active|hover|link|visited|focus)\\b'
name: entity.other.attribute-name.pseudo-class.css
- captures:
'1':
name: punctuation.definition.entity.css
match: '(::)(shadow)\\b'
name: entity.other.attribute-name.pseudo-class.css`;
const subst = `$1$2$6$7\n$5$3$4`;
// The substituted value will be contained in the result variable
const result = str.replace(regex, subst);
console.log('Substitution result: ', result);
Please keep in mind that these code samples are automatically generated and are not guaranteed to work. If you find any syntax errors, feel free to submit a bug report. For a full regex reference for JavaScript, please visit: https://developer.mozilla.org/en/docs/Web/JavaScript/Guide/Regular_Expressions