我有以下正则表达式
var string_regex=(\s*[\{\[]?\%?[\s]*)[\@A-Za-z1-9_\.\s\+\-\*\\]*([\s\*]*=[\s\*\$]*[\{\"]?)[\@A-Za-z1-9_\.\s\+\-\*\\]*(\s*[\}\"]?)([\}\]\%\s]*)
[\@A-Za-z1-9_\.\s\+\-\*\\]*
最终将被我的程序中的字符串替换,该字符串将被写入使用$1, $2, $3 and $4
的文件,如下所示:
val newLineToBeReplacedOrAdded = "$1" + "set type cookies" + "$2" + "sugar cookies" + "$3" + "$4"
我正在测试的字符串是
{% set type cookies = "sugar cookies" %}
它恰当地匹配。但是,我遇到的问题是,当我将其写入文件时,间距不会保留在等号旁边,所以我最终会用
{% set type cookies= "sugar cookies" %}
这是一个非常小的差异,但我很欣赏有关如何进一步改善表达的反馈以防止这种情况。
我认为这是一个特别针对[\@A-Za-z1-9_\.\s\+\-\*\\]*
答案 0 :(得分:3)
(\s*[\{\[]?\%?[\s]*)[\@A-Za-z1-9_\.\s\+\-\*\\]*[^\s]([\s\*]*=[\s\*\$]*[\{\"]?)[\@A-Za-z1-9_\.\s\+\-\*\\]*(\s*[\}\"]?)([\}\]\%\s]*)
^^
你必须要求前一组不要消耗这个空间。参见演示。
https://regex101.com/r/yN4mX0/2
或如果您lookbehind
使用
(\s*[\{\[]?\%?[\s]*)[\@A-Za-z1-9_\.\s\+\-\*\\]*(?<!\s)([\s\*]*=[\s\*\$]*[\{\"]?)[\@A-Za-z1-9_\.\s\+\-\*\\]*(\s*[\}\"]?)([\}\]\%\s]*)
^^
参见演示。
答案 1 :(得分:3)