间距在正则表达式中混乱

时间:2015-08-11 18:18:32

标签: regex

我有以下正则表达式

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" %}

这是一个非常小的差异,但我很欣赏有关如何进一步改善表达的反馈以防止这种情况。

Here is a link to the regex!

我认为这是一个特别针对[\@A-Za-z1-9_\.\s\+\-\*\\]*

的问题

2 个答案:

答案 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]*)

                                                 ^^

参见演示。

https://regex101.com/r/yN4mX0/4

答案 1 :(得分:3)

在=。之前在空间上进行非贪婪的匹配。

[\@A-Za-z1-9_\.\s\+\-\*\\]*?

https://regex101.com/r/yN4mX0/3