" |"的正则表达式分开的值

时间:2016-05-19 07:34:16

标签: regex

我想验证这样的一行:

Price (sales)||ALL|Table|HOTP3060|General|3000||||B2B|BUC|149.9|RON|0|0|0|18.05.2016|31.12.2099|YES

首先,我不需要非常具体。只需检查垂直条的数量是否正确。如上所示,缺少条形图之间的一些信息。这不是错误,只是缺失,我们应该去下一个垂直栏等等。

如果任何" |"应该注意到错误。不见了。

还有一件事,包含3000,149.9的字段应该被限制为十进制数字。

我正在看这个伪代码:

  • 任何字符或缺少|任何字符或缺少| .... | dec值或缺失|

    • 以及格式固定的日期:dd.mm.yyyy

我开始时:

[a-zA-Z()]+\|\|[a-zA-Z]+\|[a-zA-z]+\|[a-zA-Z0-9]+\|

但我不知道如何提及某些信息可能会丢失的事实。

类似的东西:

  • [a-zA-Z()] +字符或没有|
    • [A-ZA-Z0-9] + \ |字符和数字或没有|

好的,我到了这里:

 [a-zA-Z()]+\|\|[a-zA-Z]+\|[a-zA-z]+\|[a-zA-Z0-9]+\|[a-zA-Z]+\|[0-9]+\|\|\|\|[a-zA-Z]+\|[a-zA-Z]+\|\d+(\.\d{1,2})\|[a-zA-Z]+\|\d+\|\d+\|\d+\|[0-9]+\.[0-9]+\.[0-9]+\|[0-9]+\.[0-9]+\.[0-9]+\|\w+

一切都被解析了......但是看起来很难看......

1 个答案:

答案 0 :(得分:1)

首先,为数字创建模式:\d+(\.\d+)?和日期:\d\d\.\d\d\.\d{4}。然后,提出一个匹配单个|分隔的细分的模式:[^|]*|。然后根据需要组合三种模式:

^                             start of string anchor
([^|]*\|){6}                  match exactly 6 |-delimited segments
(\d+(\.\d+)?)?                match a decimal number or nothing
(\|[^|]*){5}                  match exactly 5 |-delimited segments
\|(\d+(\.\d+)?)?              match a | delimiter and if possible a number
(\|[^|]*){4}                  match 4 |-delimited segments
(\|(\d\d\.\d\d\.\d{4})?){2}   match a | delimiter and if possible a date. Two times.
\|[^|]*                       match one last | segment
$                             end of string anchor, makes sure we've matched the whole string

结果:

^([^|]*\|){6}(\d+(\.\d+)?)?(\|[^|]*){5}\|(\d+(\.\d+)?)?(\|[^|]*){4}(\|(\d\d\.\d\d\.\d{4})?){2}\|[^|]*$