【问题标题】:Can someone check this regex statement please?有人可以检查这个正则表达式语句吗?
【发布时间】:2011-05-27 14:55:19
【问题描述】:

我只需要验证此正则表达式语句是否会执行我想要的操作。

给定以下 json 字符串

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

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

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

将始终返回字符串 Provider":"

后面的单词

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

我将在使用 java regex 引擎的 Apache Camel 中使用这个表达式。

谁能发现我的策略中的任何陷阱。

【问题讨论】:

  • 为什么不解析 JSON 字符串?
  • 您的策略中的缺陷是您建议使用正则表达式来完成许多库已经支持的基本正确解析任务。
  • ...现在你有两个问题...
  • {"Provider":"Hello\"World\""}, {"Not-The-\"Provider":""}, {"a":'still not a "Provider":"just a string"'} - 我应该继续吗?另一种选择是JSON data = parseJSON(str); JSON provider = data['Provider'];(在一个想象的解析器上,但你明白了)。

标签: java regex spring apache-camel lookbehind


【解决方案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>

一路走来,我学到了很多关于骆驼和春天的知识,因此感谢评论者将我推向正确的方向。

【讨论】:

    【解决方案2】:

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

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

    使用 perl 风格的正则表达式

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多