有人可以查看这个正则表达式声明吗?

时间:2010-12-18 17:22:39

标签: java regex spring apache-camel lookbehind

我只需要验证此正则表达式语句是否符合我的要求。

给出以下json字符串

{"a":"1","Provider":"WebHook","b":"2"}

我需要确保以下正则表达式

(?<=\bProvider":")\w+

将始终返回字符串提供商“后面的字词:”

在这种情况下,字符串提供商“:”后面的字词是 WebHook ,但它可以是任何字词。我控制了这个词,所以它永远不会包含非ascii字符。

我将在Apache Camel中使用这个表达式,它使用java正则表达式引擎。

任何人都可以发现我的策略中的任何陷阱。

2 个答案:

答案 0 :(得分:1)

虽然解析是正确的解决方案,但是符合标准的正则表达式并不难构建:

/"Provider":"(.*?)"/

使用perl样式regexs

答案 1 :(得分:1)

好的,谢谢你的建议。我咬紧牙关并以正确的方式做事,而不是解析正则表达式。这是我的解决方案:

我构建了一个使用org.codehaus.jackson.map.ObjectMapper的服务。该类将交换体作为参数。它看起来像这样。

public class ProviderTypeWrangler {

    public String getProvider(String json) {

        try {

            ObjectMapper mapper = new ObjectMapper();
            Integration integration;
            integration = mapper.readValue(json, Integration.class);
            return integration.getProvider();
        } catch (JsonParseException e) {
            return "";
        } catch (JsonMappingException e) {
            return "";
        } catch (IOException e) {
            return "";
        }

    }

}

然后我使用routing slip模式提供对此服务的访问。如果有人认为另一个EIP是合适的,我会乐于接受建议。无论如何,这是一个例子。

public class WufooIntegrationRoutingSlip {

    @RoutingSlip
    public String slip(String body) {
        String answer = "activemq:noProducerDefined";
        ProviderTypeWrangler wrangler = new ProviderTypeWrangler();
        String producer = wrangler.getProvider(body);
        Logger mylogger = Logger.getLogger("log4j.logger.org.apache.camel");
        if (!producer.equals("")) {
            mylogger.info("Body:"+body);
            answer = "activemq:"+producer;
        }
        return answer;
    }

}

然后,在我的camel.xml文件中,我将此路由单公开为bean

<bean id="integrationBean" class="com.wufoo.camel.WufooIntegrationRoutingSlip"/>

我使用该bean将交换路由到正确的队列。

<route errorHandlerRef="dlc" autoStartup="true" id="IntegrationQueue" xmlns:ns2="http://camel.apache.org/schema/web" xmlns="http://camel.apache.org/schema/spring">
    <description>Send all integrations here.  Logic will parse to individual queue based on Provider.</description>
    <from uri="activemq:integration"/> 
    <bean ref="integrationBean"/>
</route>

我一路上学到了很多关于骆驼和春天的知识,所以感谢评论者推动我朝着正确的方向前进。