Select 三个字符,除非它们跟在 TextBuffer .replace() 的 @ 符号之后

Select three characters unless they follow an @ sign for the TextBuffer .replace()

我想 select 并替换三个字符,比如 "STR",除非它们在 @ 符号之后。

我使用 text buffer class 替换方法。我可以替换三个字符,但它也替换了三个字符之前的字符。

这是我的代码:

static void simpleReplace(Args _args)
{
    TextBuffer txtb = new TextBuffer();         

    txtb.setText(" STR @STR #STR");
    txtb.regularExpressions(true);

    txtb.replace("[^@]STR", "FOO");
    info(txtb.getText());        
}

结果是"FOO @STR FOO"。

我想要的结果是“FOO @STR #FOO”,space 和# 完好无损。

我认为问题在于我正在匹配四个字符,但只想替换三个。我假设我需要一个非捕获组或一些环顾四周。我在 Debuggex 中尝试了以下表达式:

[^@](?:(STR))

Debuggex Demo

这似乎有效,并且 select 如果三个字符不跟在 @ 后面,则它们是有效的,但似乎不受 Dynamics AX 的支持。我查看了 this page 以获得 X++ RegEx 支持,但找不到任何可以解决我的问题的语法。

是否可以更改上述作业以产生此输出:“ FOO @STR #FOO”。

我很难想到一个单一的替换解决方案,允许的正则表达式语法有限。我有一个解决方案,但它不是最优的,可能不适用于您的具体情况。

static void simpleReplace(Args _args)
{
    TextBuffer txtb = new TextBuffer();         

    txtb.setText(" STR @STR #STR");
    txtb.regularExpressions(true);

    txtb.replace("STR", "FOO");
    txtb.replace("@FOO", "@STR");
    info(txtb.getText());        
}

将所有 STR 替换为 FOO,然后将所有 @FOO 替换为 @STR。它应该具有相同的效果,但是根据数据,这可能不适合您。