我想验证这样的一行:
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值或缺失|
我开始时:
[a-zA-Z()]+\|\|[a-zA-Z]+\|[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+
一切都被解析了......但是看起来很难看......
答案 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}\|[^|]*$