【问题标题】:PCRE regex contraint for repetition用于重复的 PCRE 正则表达式约束
【发布时间】:2017-09-04 19:15:09
【问题描述】:

谁能告诉我如何编写包含 9 个数字的 PCRE 正则表达式,并且字符串最多可以包含单个数字的 5 个重复项。我找不到复制的约束。

我在sas中使用perl正则表达式

data regexp;
    if _n_=1 then pattern=prxparse("~^(48|0|48|0048|)+[1-9]{1}+[0-9]{8}~o");
    retain pattern;
    set new;
    if prxmatch(pattern,nr_tel) then flg=1; else flg=0;
run;

谢谢。 更重要的是: 我正在尝试获取前缀为 48 或不带前缀的 9 位数字。 (48|0|48|0048|) 这部分不适用于没有前缀。

【问题讨论】:

  • 请添加通过/失败示例
  • 这不是 Perl 代码。请edit您的问题用正确的语言标记。
  • 目前还不清楚模式应该匹配什么,但正则表达式模式匹配可能不是解决这个问题的最佳方法。
  • 这个怎么样:^(?!.*?(\d)(.*?\1){5})\d{9} 匹配 "111112222" 但拒绝 "111111222"

标签: regex sas pcre


【解决方案1】:
  1. 您需要用^$ 锚定两端,这样长度才有意义。
  2. 前瞻 (?!.*?(\d)(.*?\1){5,}) 断言不超过 5 个相同的数字。
  3. \d{9} 匹配 9 位数字。

所以:

/^(?!.*?(\d)(.*?\1){5,})\d{9}$/ 

会的。

Demo

正如 cmets 中所述——感谢 Bart Kiers 完善了负前瞻,它可以是 (?!.*?(\d)(.*?\1){5}) 但这只是稍微快一点。


如果你想要一个可选的前缀,你会这样做:

/^(?!.*?(\d)(.*?\1){5,})(?:048|48)?\d{9}$/

Demo

【讨论】:

  • {5,} 也可以是{5},除此之外,请注意! :)
  • @BartKiers:谢谢你。在您添加 ? 之前,我一直在为前瞻而苦苦挣扎
  • 谢谢,我发现它很有用。顺便提一句。你知道怎么放48|或 048 或开头没有任何内容 (^48|048|) 不起作用。
  • 一开始我不清楚你在寻找什么(^48|048|)。这是对所描述的模式的补充还是替代?
  • 是的,开头必须是 48 或 0048 或 048 或什么都没有。
猜你喜欢
  • 1970-01-01
  • 2020-05-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-20
  • 1970-01-01
相关资源
最近更新 更多