0

我需要验证一个分号分隔的字符串:

例子:

;XYZ;2;200;event18=2.5;eVar12=Sale
  1. 开头的分号必须存在。
  2. 'XYZ' 部分是强制性的,可以是任何长度的任何单词或空白字符。
  3. '2' 元素是强制性的,并且必须是未知长度的数字。
  4. “200”部分是强制性的,并且必须是未知长度的数字。
  5. 'event18=2.5' 是可选的。如果存在,事件编号将始终为 1 或 2 位数字,在 = 符号之后将是长度未知的数字,可能包含小数点。
  6. 'eVar12=Sale' 是可选的。如果存在,eVar 编号将始终是 1 或 2 位数字,在 = 符号之后将是单词字符和空格的任意组合。

我已经为此努力了几个小时,但我是正则表达式新手,我怀疑答案相当复杂?任何帮助将不胜感激。

4

3 回答 3

1

图案:

^;([\w\s]+);(\d+);(\d+)(?:;event(\d{1,2})=(\d+(?:.\d*)))?(?:;eVar(\d{1,2})=([\w\s]+))?$

JavaScript 示例:

var regex = /^;([\w\s]+);(\d+);(\d+)(?:;event(\d{1,2})=(\d+(?:.\d*)))?(?:;eVar(\d{1,2})=([\w\s]+))?$/,
    input = ";XYZ;2;200;event18=2.5;eVar12=Sale";

console.log(input.match(regex));
于 2013-09-17T11:07:41.260 回答
1

你可以尝试这样的事情:

^;[A-Za-z ]+(?:;[0-9]+){2}(?:;event[1-9][0-9]?=[0-9]+(?:\.[0-9]+)?)?(?:;eVar[1-9][0-9]?=[A-Za-z ]+)?$

正则表达式101演示

但是,如果您的意思是字母、数字和下划线中描述的“单词字符” \w,那么您可以使用:

^;[\w ]+(?:;[0-9]+){2}(?:;event[1-9][0-9]?=[0-9]+(?:\.[0-9]+)?)?(?:;eVar[1-9][0-9]?=[\w ]+)?$
于 2013-09-17T11:29:41.427 回答
0

我会使用CSV解析器来拆分字段并单独检查每个字段,但作为替代方案,我们开始:

regex一点都不难。它的基本知识可以带你到达终点。

要匹配任何类型的字符,如第二点,请使用字符类中否定的分隔符,如[^;]+.

数字是\d,及其适当的量词,如*+{...}

对于可选点,将它们括在括号和可选元字符中(?:...)?

结果是(python版本):

re.match(r';[^;]+;\d+;\d+;(?:event\d{1,2}=(?:\d+\.)?\d+)?;(?:eVar\d{1,2}=.*)?', string)

它应该可以工作,但如果没有,现在您已准备好根据您的需要对其进行调整。

于 2013-09-17T11:03:12.687 回答