正则表达式选择前缀之后的所有数字,并带有最小和最大位数,并跳过非数字字符(最多4个)

时间:2019-02-01 11:49:29

标签: .net regex

我正在尝试创建一个正则表达式,该正则表达式选择一个关键字后的数字。 样本数据:

  • yyyuiy合约\ 12345678
  • hjdhd合同:87654321已支付
  • somedata contract87654321T
  • 错误数据合同:1234567899错误->这个数字太多

常用关键字是“合同”,此关键字后面是0到4个可能的非数字字符。然后,合同编号始终在7或8个数字之间。当数字更多时,不应选择它。 我从(?<= Contract)(。*)([0-9] +)开始 选择很多。我只需要数字,只有7或8位数字时才需要。

如果您有解决方案,也可以请您解释如何做,以便我可以学习。

结果应该是

  • 12345678
  • 87654321
  • 87654321

4 个答案:

答案 0 :(得分:1)

您可以使用quantifier指定数字位数和非数字位数,并使用负数lookahead来检查7或8位数字之后是否没有其他数字。

要匹配合同的所有变体,您可以使匹配大小写不敏感或匹配合同,例如[Cc]ontract

(?<=\b[Cc]ontract)\D{0,4}([0-9]{7,8})(?!\d)

Regex demo

这将匹配

  • (?<=\b[Cc]ontract),肯定会在左边声明合同或合同(如果您不想使用后面的搜索,也可以匹配\b[Cc]ontract
  • \D{0,4}匹配0-4次而不是数字
  • ([0-9]{7,8})一次捕获7-8位数字
  • (?!\d)负向断言来断言以下内容不是数字

.NET支持无限回溯。在这种情况下,您可以使用:

(?<=\b[Cc]ontract\D{0,4})[0-9]{7,8}(?!\d)

.NET regex demo

答案 1 :(得分:1)

您可以使用此正则表达式,

(?i)contract[^\d]{0,4}(\d{7,8})(?!\d)

说明:

  • (?i)-在您拥有Contract和其他contract的地方启用不区分大小写的匹配
  • contract-与文本完全匹配
  • [^\d]{0,4}-匹配除数字外的任何字符0到4次
  • (\d{7,8})-匹配长度为7到8的数字
  • (?!\d)-如果前面有数字,则拒绝比赛

Demo

答案 2 :(得分:0)

使用javascript:/contract(?!(\d{0-4}))(\d{7,8})(?!(\d))/i

“合约”,后跟任意0到4个非数字字符((?!(\d{0-4}))表示长度在0到4之间且不包含数字的字符串),直到找到7或8个数字的序列({{ 1}}),下一个符号不是数字((\d{7,8}))。 (?!(\d))标记的装置,该正则表达式是不区分大小写的。

在我已经回答了我见过的问题是.NET相关。在c#中,您可以使用相同的模式(末尾的i除外)并传递i选项。

答案 3 :(得分:0)

尝试这个

\b[cC]ontract\D{0,4}(\d{7,8})(?:\D|$)

Demo