Regex 选择三个字符,除非它们跟在TextBuffer.replace()的@符号后面

Regex 选择三个字符,除非它们跟在TextBuffer.replace()的@符号后面,regex,string,axapta,x++,dynamics-ax-2012-r3,Regex,String,Axapta,X++,Dynamics Ax 2012 R3,我想选择并替换三个字符,比如说“STR”,除非它们在@符号之后 我使用替换方法。我可以替换这三个字符,但它也会替换这三个字符之前的字符 这是我的代码: static void simpleReplace(Args _args) { TextBuffer txtb = new TextBuffer(); txtb.setText(" STR @STR #STR"); txtb.regularExpressions(true); txtb.rep

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

我使用替换方法。我可以替换这三个字符,但它也会替换这三个字符之前的字符

这是我的代码:

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”,空格和#完好无损

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

[^@](?:(STR))

这似乎是可行的,如果这三个字符不跟随@,则会选择它们,但Dynamics AX似乎不支持这三个字符。我查看了X++正则表达式支持,但找不到任何语法可以解决我的问题


是否可以更改上面的作业以生成此输出:“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
。它应该具有相同的效果,但是根据数据的不同,这可能不适合您。

您知道X++是否支持向后看吗?如果是这样,请尝试以下操作:
(?对于上述regexIf X++不支持查找的示例,请尝试以下操作:
([^@])STR
,并将替换字符串更改为
$1FOO
(可能是
\1FOO
,具体取决于语法)感谢所有的选项!不幸的是,它们都不起作用。我还以为它会基于C#,但我猜自从Dynamics的Axapta时代以来,TextBuffer类就已经存在,它是基于X++的。我想出了一个新的答案。这是我能想到的最好的答案,语法有限。虽然不是一个很好的解决方案,但我同意这是probably是解决此问题的最快方法。在我的数据中,有“@STR”需要保留“@STR”,但根据你的建议,我可以分三步替换文本。谢谢!@TinavanderVyver没问题!这是我能想到的最好的事情:/