具有多个OR / AND运算符的正则表达式

时间:2014-03-16 05:59:58

标签: regex

我试图匹配以下文字:

  • 数字和字母的组合,可能包含[:,.]

OR

  • 一个*字符加上至少一个数字OR字母(不一定按此顺序)

意思是我的正则表达式应匹配所有这些

Bf1305020008401 6798ubbii230693
Nettbank til: Troij iudh Betalt: 03.05.13
7509*30.04
*87589

但不是这些:

 
0205
252,25

2 个答案:

答案 0 :(得分:3)

是的,带|的{​​{3}}在字符组(例如[a-z|0-9])中的含义与其在模式中的其他位置无关。 (将其视为字符组中字符和字符范围之间的隐含,使其变得多余。)

模式

这种模式可以满足您的需求:

^((?=^.{0,}[0-9])(?=^.{0,}[a-zA-Z])[0-9a-zA-Z :,.]{2,}|(?!^\*$)(?=^[0-9.a-zA-Z]{0,}\*[0-9.a-zA-Z]{0,})(?!^[0-9.a-zA-Z]{0,}\*[0-9.a-zA-Z]{0,}\*)[*0-9.a-zA-Z]{2,})$

匹配......

Bf1305020008401 6798ubbii230693
Nettbank til: Troij iudh Betalt: 03.05.13
7509*30.04
*87589

......并且不匹配......

 
0205
252,25

......根据您的需要。

您可以使用regex alternation中指定的输入尝试该模式。

解释

第一个子模式(|左侧)与第一组匹配条件匹配的一些解释:

  1. (?=^.{0,}[0-9]) - 断言数字出现在字符串中。
  2. (?=^.{0,}[a-zA-Z]) - 断言字母中还会出现一个字母(即 AND )。
  3. [0-9a-zA-Z :,.]{2,} - “数字和字母的组合,可能包含[:,。]”(假设上述断言)
  4. 同样,第二个子模式(在|右侧)与第二组匹配条件匹配的一些解释:

    1. (?!^\*$) - 断言字符串不仅仅是*
    2. (?=^[0-9.a-zA-Z]{0,}\*[0-9.a-zA-Z]{0,}) - 断言字符串包含*
    3. (?!^[0-9.a-zA-Z]{0,}\*[0-9.a-zA-Z]{0,}\*) - 断言字符串不包含多个*
    4. [*0-9.a-zA-Z]{2,} - “a *字符+至少一个数字或字母(不一定按此顺序)”(假设上述断言)
    5. 可能还有沙子和沙子的空间。抛光模式 - 尤其是我怀疑的第二个子模式中*的前瞻断言; 但它起作用并传达了我采用的多个前瞻断言的策略来约束两个子模式中的每一个以满足您的要求。

答案 1 :(得分:0)

当你在下面发表评论时,我认为你需要一个完整的行匹配,并且通过说出数字和字母,我认为这意味着数字和字母都出现在正确的匹配中。 并且通过说“一个*字符+至少一个数字或字母”,我认为“*”在匹配中只出现一次。

也许你可以试试这个:

(^(?=.*[a-zA-Z]+)(?=.*[0-9]+)[0-9a-zA-Z :,.]+$)|(^[a-zA-Z0-9.]*\*[a-zA-Z0-9.]+$)|(^[a-zA-Z0-9.]+\*[a-zA-Z0-9.]*$)

匹配:

Bf1305020008401 6798ubbii230693
Nettbank til: Troij iudh Betalt: 03.05.13
7509*30.04
*87589
123456*
.*.
test123
123test

但不会匹配任何一个:

 
0205
252,25
*
123*345*789
rebound
test
123

<强>原始

这应该有效

(^[A-Za-z0-9 ]*(([A-Za-z]+[ ]*[0-9]+)|([0-9]+[ ]*[A-Za-z]+))[A-Za-z0-9 ]*$)|(^\*[A-Za-z0-9]+$)