选择三个字符,除非它们遵循TextBuffer的@符号.replace()

Tin*_*ver 3 regex string x++ axapta dynamics-ax-2012-r3

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

我使用带有replace方法的文本缓冲区类.我可以替换这三个字符,但它也会替换三个字符前的字符.

这是我的代码:

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

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

    txtb.replace("[^@]STR", "FOO");
    info(txtb.getText());        
}
Run Code Online (Sandbox Code Playgroud)

结果是"FOO @STR FOO".

我想要的结果是"FOO @STR #FOO",空格和#完好无损.

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

[^@](?:(STR))
Run Code Online (Sandbox Code Playgroud)

正则表达式可视化

Debuggex演示

如果它们不跟随@,这似乎可以工作并选择三个字符,但似乎不受Dynamics AX的支持.我查看了此页面以获得X ++ RegEx支持,但找不到任何可以解决我的问题的语法.

是否可以更改上面的作业以产生此输出:"FOO @STR #FOO".

d0n*_*nut 5

我很难想到单个替换解决方案,允许使用正则表达式的有限语法.我有一个解决方案,但它不是最佳的,可能无法在您的具体情况下工作.

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());        
}
Run Code Online (Sandbox Code Playgroud)

更换所有STRFOO那么所有@FOO使用@STR.它应该具有相同的效果,但根据数据,这可能不适合您.