首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >正则表达式在前缀后选择所有数字,并具有最小和最大数字数,并跳过非数字字符(最多4)

正则表达式在前缀后选择所有数字,并具有最小和最大数字数,并跳过非数字字符(最多4)
EN

Stack Overflow用户
提问于 2019-02-01 11:49:29
回答 4查看 1.1K关注 0票数 1

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

  • yyyuiy合同\ 12345678
  • ?生署合约: 87654321已付款
  • 一些数据contract87654321T
  • 错误数据契约:1234567899错误->这有太多的数字

常用的关键字是"Contract",在这个关键字之后,0到4个可能的非数字字符。然后是合同的编号,总是在7或8个数字之间。当有更多的数字时,不应该选择它。我从(?<=Contract)(.*)(0-9+)开始,它选择了很多。我只需要号码,只有当它有7或8位数。

如果你有一个解决办法,你也能解释一下怎么做,这样我就可以从中吸取教训。

结果应该是

  • 12345678
  • 87654321
  • 87654321
EN

回答 4

Stack Overflow用户

发布于 2019-02-01 11:53:15

您可以使用量词来指定数字和非数字的数量,并使用负前瞻检查在7或8位之后是否有更多的数字跟随。

若要匹配合同的所有变体,可以使匹配大小写不敏感或匹配合同类似于[Cc]ontract

代码语言:javascript
复制
(?<=\b[Cc]ontract)\D{0,4}([0-9]{7,8})(?!\d)

Regex演示

那就匹配了

  • (?<=\b[Cc]ontract)正向后向后断言左边的是契约或契约(如果您不想使用Contract,也可以匹配它,而不是\b[Cc]ontract)
  • \D{0,4}匹配0-4次而不是数字
  • 一组([0-9]{7,8})捕获7-8次数字
  • (?!\d)负前瞻性断言以下内容不是数字

.NET支持无限查找。在这种情况下,您可以使用以下方法获得匹配:

代码语言:javascript
复制
(?<=\b[Cc]ontract\D{0,4})[0-9]{7,8}(?!\d)

.NET regex演示

票数 1
EN

Stack Overflow用户

发布于 2019-02-01 11:54:20

你可以用这个正则表达式,

代码语言:javascript
复制
(?i)contract[^\d]{0,4}(\d{7,8})(?!\d)

解释:

  • (?i) -启用不区分大小写的匹配,就像在有Contract和其他contract的地方一样
  • contract -字面上匹配这个文本
  • [^\d]{0,4} -匹配任何字符0到4次,但数字除外
  • (\d{7,8}) -匹配长度为7到8的数字
  • (?!\d) -如果前面有一个数字,就会拒绝匹配。

演示

票数 1
EN

Stack Overflow用户

发布于 2019-02-01 12:12:22

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

后面跟着任何0到4个不是数字的字符((?!(\d{0-4}))是指长度介于0到4之间的不包含数字的字符串),直到找到一个7或8位的序列((\d{7,8})),其中下一个符号不是数字((?!(\d)))。i标志意味着正则表达式不区分大小写。

在我回答之后,我发现这个问题与.net有关。在c#中,您可以使用相同的模式(除了末尾的i )并传递RegexOptions.IgnoreCase选项。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54478910

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档