是否可以为这种类型的文本编写正则表达式?

时间:2010-07-22 16:23:54

标签: c# regex

我需要为我公司的'选项符号'编写正则表达式,以便我们可以在我们的网站上验证这些符号。

选项符号由两部分组成:

Part1         Part2
_ _ _ _ _ _ | _ _ _ _ _ _ _ _ _ 

我可以为Part2编写正则表达式,因为它非常简单。

但是,第1部分(前6个字符位置)可能有点复杂。

归结为:

  • 第1部分的长度必须为{6}个字符。
  • 第一个位置必须有{1,4}个字母字符。
  • 之后,可以选择{1}数字字符。
  • 最后,剩余的剩余字符必须是空格,因此Part1总计为6个字符。

我遇到的问题是空格的数量是根据它之前的字符数而变化的。这让我觉得它不易用常规语言表达。

我怎样才能避免暴力逼迫:

([A-Za-z]{1}[0-9]{1}[ ]{4}|
[A-Za-z]{2}[0-9]{1}[ ]{3}|
[A-Za-z]{3}[0-9]{1}[ ]{2}|
[A-Za-z]{4}[0-9]{1}[ ]{1}|
[A-Za-z]{1}[ ]{5}|
[A-Za-z]{2}[ ]{4}|
[A-Za-z]{3}[ ]{3}|
[A-Za-z]{4}[ ]{2}|
[A-Za-z]{5}[ ]{1})

以下是一些示例选项符号(请记住,忽略前6个字符以外的所有内容):

F     123456P12345678
CMG   123456P12345678
AAPL  123456P12345678
GOOG1 123456C12345678
F5    123456C12345678

3 个答案:

答案 0 :(得分:6)

您可以使用lookbehind断言:

^[A-Za-z]{1,4}\d? +\b(?<=^.{6})

<强>解释

^:匹配行或字符串的开头(取决于您是否设置选项RegexOptions.Multiline)。

[A-Za-z]{1,4}\d? +:匹配1到4个字母字符和一个可选数字,后跟至少一个空格

\b:断言我们现在处于单词边界(即下一个字符是字母数字)

(?<=^.{6}):断言上面的匹配正好是六个字符。

答案 1 :(得分:0)

尝试以下方法:

[A-Za-z]{1,4}[0-9]{1}?\s*?

{1,4}允许使用可变数量的字母数字,?允许它是可选的,*类似于{0,}

答案 2 :(得分:0)

将其作为2部分检查,第一部分是正则表达式,第二部分是与正则表达式匹配的长度。

即正则表达式的类似内容:

[:alpha:] {1,4} [:digit:]?[] {1,5}

检查匹配表达式的长度将确保它有效,因为如果单个部分无效,则正则表达式将不匹配。因此,如果每个部分(字母,数字和空格)有效且长度为6,那么您将获得有效匹配。