管道之间的文本(字符串和数字)的正则表达式

时间:2017-08-29 13:01:57

标签: regex

我有这种情况:

练习1:

Valid:
12345678|abcdefghij|aaaaaaaa
Invalid:
12345678|abcdefghijk|aaaaaaaaa

这意味着管道之间的最大长度为8.如何在正则表达式中生成?

我把这个

^(?:[^|]+{0,7}(?:\|[^|]+)?$但它不起作用

2 个答案:

答案 0 :(得分:3)

尝试以下模式:

^.{1,8}(?:\|.{1,8})*$

基本思路是匹配1到8个字符,然后是|和另外1到8个字符,该术语重复零次或多次。使用您想要查看其工作原理的任何数据来探索演示。

示例数据:

123
12345678
abcdefghi                      (no match)
12345678|abcdefgh|aaaaaaaa
12345678|abcdefghijk|aaaaaaaaa (no match)

在这里演示:

Regex101

答案 1 :(得分:1)

如果要匹配分隔数据,则应避免使用普通的无限制.。您需要匹配|之间的部分,因此您应该考虑[^|]否定的字符类构造,该构造匹配除|之外的任何字符。

由于您需要限制否定字符类的模式出现次数,因此使用限制量词{1,8}来限制它,该限制量词^[^|]{1,8}(?:\|[^|]{1,8})*$ 匹配量化子模式的1到8次连续出现。

使用

^

请参阅正则表达式演示。

<强>详情

  • [^|]{1,8} - 字符串的开头
  • | - 除(?:\|[^|]{1,8})*
  • 以外的任何1到8个字符
  • \| - 0个或更多连续序列:
    • [^|]{1,8} - 文字管道符号
    • | - 除$
    • 以外的任何1到8个字符
  • [^|] - 字符串结束。

然后,(可以根据要求进一步限制。如果您只需要验证包含ASCII字母,数字,)+,./:的字符串,?-,空格和^[A-Za-z0-9()+,.\/:?\s-]{1,8}(?:\|[A-Za-z0-9()+,.\/:?\s-]{1,8})*$ ,您需要使用

<parallel>methods</parallel>

请参阅another regex demo