use strict;
my $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';
my $regex = qr/^([ ]{6})(- )((?!name)\w+[:](?:[ ]*(?=\n\1[ ]{4}\S)|[ ]*\S.+))((?:\n\1[ ]{2}.+)*?)(?:\n(\1[ ]{2})(name[ ]*[:])((?:[ ]*(?![>|])\S.+\b)|(?:(?:[ ]*[>|])?\n\5[ ]+.+)*))[ ]*$/mp;
my $subst = '$1$2$6$7\\n$5$3$4';
my $result = $str =~ s/$regex/$subst/rg;
print "The result of the substitution is' $result\n";
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 Perl, please visit: http://perldoc.perl.org/perlre.html