【问题标题】:Regex for fix length string which allow space(s) at end only. C#固定长度字符串的正则表达式,仅在末尾允许空格。 C#
【发布时间】:2016-04-23 12:25:10
【问题描述】:

我需要正则表达式

  1. 允许 a-z、A-Z、0-9。

  2. 固定为 20 个字符。

  3. 开头或中间的空格不允许

  4. 末尾有空格允许

例子:

12345678901234567890 [Match]

1234567890           [Match]

abcde12345           [Match]

 abcdefg             [Not match]

ab cdefg             [Not match]

我使用这个正则表达式,它工作得很好,但它真的很长而且很难维护。

[a-zA-Z0-9]{20}|[a-zA-Z0-9]{19}\s{1}|[a-zA-Z0-9]{18}\s{2}
|[a-zA-Z0-9]{17}\s{3}|[a-zA-Z0-9]{16}\s{4}|[a-zA-Z0-9]{15}\s{5}
|[a-zA-Z0-9]{14}\s{6}|[a-zA-Z0-9]{13}\s{7}|[a-zA-Z0-9]{12}\s{8}
|[a-zA-Z0-9]{11}\s{9}|[a-zA-Z0-9]{10}\s{10}|[a-zA-Z0-9]{9}\s{11}
|[a-zA-Z0-9]{8}\s{12}|[a-zA-Z0-9]{7}\s{13}|[a-zA-Z0-9]{6}\s{14}
|[a-zA-Z0-9]{5}\s{15}|[a-zA-Z0-9]{4}\s{16}|[a-zA-Z0-9]{3}\s{17}
|[a-zA-Z0-9]{2}\s{18}|[a-zA-Z0-9]{1}\s{19}|\s{20}

请帮忙,谢谢。


更新

实际上我需要检查很长的字符串。

起初,在我问这个问题之前,我的正则表达式看起来像这样(第一个正则表达式)

^[\s\d]{25}\d{6}[0-1]{1}\d{24}[\!\@\#\$\%\^\&\*\(\)\-\\_\=\+\/\,\?\<\>\;\:\"\'\w\s\.]{30}(\s{3}|\d{3})(\s{4}|\d{4})[\s|00|10|20|40]{2}[a-zA-Z0-9\s]{20}[\s\w\d]{0,32}$

在我提出问题后,我的正则表达式看起来像这样(第二个正则表达式)

^[\s\d]{25}\d{6}[0-1]{1}\d{24}[\!\@\#\$\%\^\&\*\(\)\-\\_\=\+\/\,\?\<\>\;\:\"\'\w\s\.]{30}(\s{3}|\d{3})(\s{4}|\d{4})[\s|00|10|20|40]{2}(?=.{20})[a-zA-Z0-9]*\s*[\s]{0,32}$

假设我将这个正则表达式分成 3 部分。

Part1:[\s\d]{25}\d{6}[0-1]{1}\d{24}[\!\@\#\$\%\^\&\*\(\)\-\\_\=\+\/\,\?\<\>\;\:\"\'\w\s\.]{30}(\s{3}|\d{3})(\s{4}|\d{4})[\s|00|10|20|40]{2}

Part2:[a-zA-Z0-9\s]{20} changed to (?=.{20})[a-zA-Z0-9]*\s*

Part3:[\s\w\d]{0,32}

第 1 部分工作正常。

第 2 部分要求已更改,因此我将其更改为 "(?=.{20}$)[a-zA-Z0-9]*\s*"

Part3 是我更改 part2 时的问题。

示例

00202510027680           1901160000000000000000000007000Test Test 009                 069      aaaaaaaaaaaaaaaaaaaa                                

字符串以 32 个空格结尾。 如果我再添加 1 个空格,第一个正则表达式不匹配。但是第二个正则表达式匹配。正确的是不匹配。

如何修改第 2 部分(或第 3 部分)以满足要求。谢谢。

demo for 1st regex

demo for 2nd regex

【问题讨论】:

标签: c# regex


【解决方案1】:

你可以使用

^(?=.{20}$)[a-zA-Z0-9]*\s*$

regex demo

在此表达式中,20 个字符的长度通过正向前瞻(?=.{20}$) 强制执行。由于匹配模式只匹配 A-Z、a-z 和 0-9,因此前瞻中的 . 是可能的。

正则表达式解释

  • ^ - 字符串开头
  • (?=.{20}$) - 字符串长度必须为 20 个字符
  • [a-zA-Z0-9]* - 零个或多个字母或数字(可以使用 + 代替 *
  • \s* - 零个或多个空格
  • $ - 字符串结束

C#:

var reg = @"^(?=.{20}$)[a-zA-Z0-9]*\s*$";

【讨论】:

  • 非常感谢@WiktorStribiżew,我认为它的工作非常完美。但实际上我需要检查很长的字符串。我已将您的答案用作我的完整正则表达式的一部分。我的正则表达式看起来像这样 [\s\d]{25}\d{6}[0-1]{1}\d{24}[\!\@\#\$\%\^\&*() \-\_\=\+\/\,\?\\;\:\"\'\w\s\.]{30}(\s{3}|\d{3})( \s{4}|\d{4})[\s|00|10|20|40]{2}(?=.{20})[a-zA-Z0-9]*\s* 。和我需要将 [\s\w\.]{32} 之类的内容附加到我的完整正则表达式中。我该怎么做?
  • 请提供示例字符串。乍一看,您的正则表达式不正确,因为您使用的是字符类而不是分组(此处:[00|10|20|40]{2})。
  • 第一字符串 “00202510027680 1901160000000000000000000007000Test试验009 069 aaaaaaaaaaaaaaaaaaaa [32个空格或任何字符]” - > [匹配],2RD字符串 “00202510027680 1901160000000000000000000007000Test试验009 069 aaaaaaaaaaaaaaaaaaaa [没有空间或字符]” - > 与第一个字符串相同,但没有空格或字符 [匹配]
  • 在处理长度限制时,必须使用边界(\b,lookarounds)/锚点(^/$),顺便说一句。
  • 我希望您将其添加到问题中并指定要求。 It does not work with the provided string。顺便说一句,您在前瞻中遗漏了$。为什么?
猜你喜欢
  • 2022-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-23
  • 1970-01-01
相关资源
最近更新 更多