Может кто-нибудь проверить это регулярное выражение, пожалуйста? - PullRequest
0 голосов
/ 18 декабря 2010

Мне просто нужно убедиться, что этот оператор регулярного выражения будет делать то, что я хочу.

Учитывая следующую строку json

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

Мне нужно убедиться, что следующее регулярное выражение

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

Всегда будет возвращать слово после строки Provider ":"

В этом случае слово, следующее за строкой Provider ":" , равно WebHook , но это может быть любое слово. У меня есть контроль над этим словом, поэтому оно никогда не будет содержать не-ascii символов.

Я буду использовать это выражение в Apache Camel, который использует движок Java Regex.

Может ли кто-нибудь заметить какие-либо подводные камни в моей стратегии.

Ответы [ 2 ]

1 голос
/ 29 декабря 2010

Хорошо, спасибо за совет, ребята. Я укусил пулю и сделал все правильно, вместо того, чтобы анализировать регулярное выражение. Вот мое решение:

Я создал сервис, который использует 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 "";
        }

    }

}

Затем я использовал шаблон маршрутной квитанции , чтобы обеспечить доступ к этой услуге. Если кто-то сочтет целесообразным другой 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 id="integrationBean" class="com.wufoo.camel.WufooIntegrationRoutingSlip"/>

И я использовал этот компонент для направления обмена в правильную очередь.

<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>

Я многое узнал о верблюде и весне по пути, поэтому спасибо комментаторам за то, что подтолкнул меня в правильном направлении.

1 голос
/ 18 декабря 2010

Хотя синтаксический анализ является правильным решением, регулярное выражение, отвечающее критериям, не сложно построить:

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

с использованием регулярных выражений в стиле perl

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...