Java正则表达式replaceAll未按预期工作

Java正则表达式replaceAll未按预期工作,java,regex,mule,mule-studio,Java,Regex,Mule,Mule Studio,我使用以下Java正则表达式(https://.*?/api/FHIR/DSTU2/)来匹配大型JSON结果中以下模式中的URL 并将其替换为另一个URL,如 我要替换的URL在JSON结果中多次出现。我正在使用Java replaceAll函数,有时它会失败,我得到的错误是“预期的”,而不是“预期的”。发生这种情况是因为JSON结果在替换过程中被弄乱,无法正确解析。奇怪的是,我使用的JSON结果与JAVA正则表达式测试失败的结果相同,而正则表达式似乎工作正常。你看到这里有什么不正常的地方吗?

我使用以下Java正则表达式(https://.*?/api/FHIR/DSTU2/)来匹配大型JSON结果中以下模式中的URL

并将其替换为另一个URL,如


我要替换的URL在JSON结果中多次出现。我正在使用Java replaceAll函数,有时它会失败,我得到的错误是“预期的”,而不是“预期的”。发生这种情况是因为JSON结果在替换过程中被弄乱,无法正确解析。奇怪的是,我使用的JSON结果与JAVA正则表达式测试失败的结果相同,而正则表达式似乎工作正常。你看到这里有什么不正常的地方吗?谢谢

我为此编写了一个JUnit案例,试图重现错误。但是,对于上一个链接下面提供的给定JSON输入,没有错误,每次都可以正常工作。你能试试这个测试用例吗

import com.fasterxml.jackson.databind.ObjectMapper;
import org.apache.commons.io.IOUtils;
import org.junit.Before;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.IOException;
import java.io.InputStream;

import static org.junit.Assert.fail;

public class RegexReplacementTest {

    private static final Logger logger = LoggerFactory.getLogger(RegexReplacementTest.class);
    private static final String replacement = "https://api.anotherdomain.edu/FHIR/DSTU2/";
    private static final String pattern = "(https://.*?/api/FHIR/DSTU2/)";
    private String json;

    @Before
    public void setup() throws IOException {
        InputStream resourceAsStream = this.getClass().getResourceAsStream("/path/to/your/test.json");
        json = IOUtils.toString(resourceAsStream);
        resourceAsStream.close();
        validateJson(json);
    }

    @Test
    public void testReplace() {
        String replacedString = json.replaceAll(pattern, replacement);
        validateJson(replacedString);
    }

    private void validateJson(String json) {
        ObjectMapper objectMapper = new ObjectMapper();
        try {
            objectMapper.readTree(json);
        }
        catch (IOException e) {
            logger.error("Error upon testing json!" , e);
            fail("Error upon testing json! " + e.getMessage());
        }
    }

}
试试这个

1.返回类为java.lang.String的字符串对象

2.带有以下代码的表达式

import java.util.regex.*;

payload=payload.replaceAll("https[:]//.*./api/FHIR/DSTU2/", "https://api.anotherdomain.edu/FHIR/DSTU2/");

return payload;
最终的xml流将是

     <object-to-string-transformer returnClass="java.lang.String" doc:name="Object to String"/>
        <expression-component doc:name="Expression"><![CDATA[import java.util.regex.*;

payload=payload.replaceAll("https[:]//.*./api/FHIR/DSTU2/", "https://api.anotherdomain.edu/FHIR/DSTU2/");

return payload;]]></expression-component>

        <object-to-string-transformer doc:name="Object to String"/>


您好,您使用哪种JSON解析器?您是否编写了单元测试,或者您是否可以为我们提供其他代码进行复制?我认为问题更多的是正则表达式问题,而不是解析器问题。在调用Java replaceAll函数后,JSON结果会变得一团糟,比如so JsonString.replaceAll(((https://.*?/api/FHIR/DSTU2/),hostURI)我明白了,谢谢。您能提供JSON负载吗?Java的哪个版本?我在这里使用的是1.8版本。它在一个单独的Java项目中运行良好。不幸的是,我从MuleSoft ESB调用它。我使用的是同一个运行时,但由于某些原因,replacAll不起作用。我在这里发牢骚。这可能是不同JSON负载出现的问题吗?不。我已经仔细检查过了。谢谢。我正在做同样的事情:replaceAll方法在控制台应用程序中工作:。此外,JSON文件在两种环境中都完全相同。这算不上什么。