gpt4 book ai didi

xml - BizTalk EDI 架构中的日期范围验证

转载 作者:数据小太阳 更新时间:2023-10-29 02:51:33 25 4
gpt4 key购买 nike

我需要验证 BizTalk 架构中元素的日期范围。我收到了开始日期早于结束日期 (20130521-20130501) 的日期。我知道我可以在映射中使用 XSLT 和 C# 轻松地解析和验证此字符串,但是,我需要将验证作为架构的一部分,以便如果收到具有此格式日期的事务,BizTalk 将拒绝 EDI 事务并将 999 拒绝返回给发件人。

我读过许多建议不要对日期范围使用正则表达式验证的帖子,但除了创建自定义管道组件或使用 C# 之外,我看不到任何其他方法。有一个架构属性允许使用正则表达式来验证输入数据。

我不太擅长正则表达式,需要一些帮助来弄清楚如何验证开始日期小于或等于结束日期。日期以字符串形式接收。我读过有关在“-”上拆分字符串的信息,但不知道如何比较结果。任何帮助将不胜感激。

最佳答案

Disclaimer: I'm using PHP, which means I'm using the PCRE regex flavor.

问题

看来你没有意识到正则表达式的局限性,不过没关系。
真正的问题是以下解决方案:检查是否x =< y并匹配它。

极限

为什么?那么你想检查一下 start date =< end date .正则表达式的思想是匹配遵循特定正则 模式的特定字符。单独使用正则表达式不能检查是否x < y因为正则表达式没有逻辑运算符 > < .

绕过一定限制

正则表达式可以做的是检查 x = y .举例来说,我有以下字符串,我想获取 x = y 所在的所有行:

10 = 10
15 = 51
33 = 31
100 = 101
780 = 780

我们可以使用以下正则表达式:^(\d+)\s*=\s*\1$m修饰符。这是什么意思?

  • ^ : 行首
  • (\d+) : 将任何数字分组并匹配一次或多次
  • \s*=\s* : 匹配空格 0 次或多次,然后是 =然后是任何空格 0 次或多次
  • \1 : 指的是第 1 组,因此仅当它与第 1 组中匹配的相同时才匹配。
  • $ : 行尾
  • m修饰符:多行。制作^$分别匹配行首和行尾
    Online demo .

概念验证

让我们进一步破解。为此 POC ,我们将匹配以下内容:x-y其中 0 =< x =< 90 =< y =< 9x =< y .
我们能做的就是尝试匹配x =< y的所有可能性。 .所以如果x=0然后 y=[0-9] , 如果 x=1然后 y=[1-9] , 如果 x=2然后 y=[2-9]等等。因为正则表达式有 or声明,我们可以编写以下正则表达式:
0-[0-9]|1-[1-9]|2-[2-9]|3-[3-9]|4-[4-9]|5-[5-9]|6-[6-9]|7-[7-9]|8-[8-9]|9-9
Online demo
你看 ?简单的对比一下居然这么长!这就是为什么任何理智的人都会使用内置的语言工具来解析和验证它。

违反正则表达式的规则

我们将使用 PHP 生成正则表达式:

$start = strtotime('2013-01-01'); // Start date
$end = strtotime('2013-03-01'); // End date
$range = array_map(function($v){return date('Ymd', $v);}, range($start, $end, 86400)); // Creating the range of dates
$result = ''; // Declaring an empty variable to store our regex in it

for($i=$start;$i<=$end;$i+=86400){ // loop each day
$result .= '(?:' . date('Ymd', $i) . '-(?:'. implode('|', $range) . '))|'; // building our regex
array_shift($range); // removing first element of range
}
$result = substr($result, 0, -1); // removing last | since we don't need it
echo $result; // Output

上面的代码将生成一个正则表达式,可以验证 2013-01-01 之间的日期。和 2013-03-01其中 x =< y形式为 x-y .此正则表达式优化,大小约为 17KB。那么想象一下,如果我将它配置为验证 10 年的范围,这个正则表达式的大小是多少?请注意,大小呈指数增长。我尝试间隔 4 个月,但收到错误/警告,指出表达式太长。
由于正则表达式太长,我无法对其进行在线演示,但这是 PHP 中的代码:

$string = '20130101-20130101
20130201-20130101
20130105-20130120
20130201-20130301
20130210-20130215
20130301-20130301
20130301-20130201
'; // A sample

$regex = file_get_contents('regex.txt'); // Get the regex from a file (which we generated previously)
preg_match_all('#'.$regex.'#', $string, $matches); // Let's regex !
print_r($matches[0]); // Printing the matches ...

输出:

Array
(
[0] => 20130101-20130101
[1] => 20130105-20130120
[2] => 20130201-20130301
[3] => 20130210-20130215
[4] => 20130301-20130301
)

Online dump of the regex | Online PHP demo

结论

请永远不要考虑使用正则表达式来完成这项任务,否则你会遇到 10 个问题:)

关于xml - BizTalk EDI 架构中的日期范围验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16974342/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com