正则表达式:匹配以--+TEXT|开头行中不在[]内的文本
解决ScriptCards输出行的非变量文本正则匹配问题
针对你需要高亮ScriptCards中--+TEXT|开头行里,排除[]变量和开头--+、|的文本需求,以下是可行的正则方案和实现思路:
核心正则规则
可以拆分为两个独立的正则,分别匹配标题部分和内容中的非变量文本,覆盖所有需要着色的区域:
1. 匹配--+与|之间的标题文本(如示例中的Move)
(?<=^--\+)([^|]+)(?=\|)
(?<=^--\+):正向预查,确保当前位置是行首--+之后([^|]+):匹配所有非|的字符,即标题内容(?=\|):正向预查,确保后面紧跟|
2. 匹配|之后不在[]内的内容文本(如示例中的Go 、spaces)
(?<=^--\+[^|]+\|)(?:(?!\[|\]).)+|(?<=\])(?:(?!\[|\]).)+
- 第一部分
(?<=^--\+[^|]+\|)(?:(?!\[|\]).)+:匹配|之后到第一个[之前的非变量文本 - 第二部分
(?<=\])(?:(?!\[|\]).)+:匹配]之后到下一个[或行尾的非变量文本 (?:(?!\[|\]).)+:负向预查,确保当前字符不是[或],匹配连续的非变量字符
在Sublime自定义语法中的配置示例
在你的.sublime-syntax文件中,可以这样配置规则:
contexts: main: - match: ^--\+ scope: punctuation.definition.scriptcards.output.start push: scriptcards-output-line scriptcards-output-line: - match: (?<=^--\+)([^|]+)(?=\|) scope: string.title.scriptcards - match: (?<=^--\+[^|]+\|)(?:(?!\[|\]).)+|(?<=\])(?:(?!\[|\]).)+ scope: string.content.scriptcards - match: \[[$&][^\]]+\] scope: variable.scriptcards - match: \| scope: punctuation.separator.scriptcards - match: $ pop: true
这个配置会:
- 先匹配行首的
--+,进入输出行上下文 - 高亮标题文本和非变量内容文本
- 同时把
[$Num]这类变量标记为变量作用域,方便区分
对之前尝试的问题修正
你之前的正则存在方向错误:
- 第一个正则
\[^\]]+(?![^\[]*\])实际是匹配[开头的变量内容,和需求完全相反 - 第二个正则的预查部分写法有误,
\(?<=多了一个转义符,应该是(?<= - 第三个正则只能匹配标题,但没覆盖内容中的非变量部分
内容的提问来源于stack exchange,提问作者mshaw
相关产品推荐
相关产品推荐

