【问题标题】:Regex - Get number that is 10 or 11 digits long only正则表达式 - 仅获取 10 或 11 位数字
【发布时间】:2017-06-19 17:27:59
【问题描述】:

所以,我编写了一个正则表达式来获取英国电话号码,如下所示:

[(]*\d{3}[)]*\s*[.\-\s]*\d{3}[.\-\s]*\d{4}

它完美地捕捉电话号码,但是如果我提供的列表包含一个超过 11 位数字的号码etc: 01234567891011121314,它将获取该号码的前 11 位数字。

我想完全排除这个数字,而不是获取前 11 位数字。

我怎样才能修改我的表达来实现这一点?

谢谢

编辑: 对于上下文: 正则表达式用于从网站源代码中获取电话号码,因此数字可以被任何字符包围,我只想捕获那些周围没有数字的数字(使其超过 11 位)

编辑 2: 以下是一些透视源代码:

<a class="social" href="https://www.facebook.com/pages/x-Ltd/194636607281565" target="_blank" title="Like us on facebook">
    <i class="icon icon-facebook"></i>
</a>
<p>123 Sesame Street</p>
<p>Brooklyn, NY</p>
<p>Contact Us: 0123 456 7890</p>

电话号码后面并不总是有&lt;

【问题讨论】:

  • 试试'~\d{11,}(*SKIP)(?!)|[(]*\d{3}[)]*\s*[.\-\s]*\d{3}[.\-\s]*\d{4}~'。但是,这仍然需要调整。请发布确切的要求。
  • @WiktorStribiżew - 添加上下文以帮助改进答案
  • 能否提供源代码的sn-p?
  • @CameronRoe 添加了一些代码以获得更多视角
  • @RyanCastle:事实上,这项任务非常艰巨。我建议尝试一系列正则表达式,看看它们是否有帮助。 1) 从单词边界开始并调整限制量词阈值 - [(]*\b\d{3,4}[)]*[.\s-]*\d{3}[.\s-]*\d{4}\b。 2)如果有“序列号”,请尝试通过环视来避免它们 - [(]*\b(?&lt;!\d-)\d{3,4}[)]*[.\s-]*\d{3}[.\s-]*\d{4}\b(?!-\d)。可能会出现其他极端情况,但只有你有数据,我们无法提供好的有效答案。

标签: php regex search


【解决方案1】:

您可以利用正则表达式上的锚定来确保匹配的内容仅在精确、大小等情况下匹配。在正则表达式的开头添加^ 表示正则表达式必须从字符串的开头开始,在正则表达式的末尾添加$ 表示正则表达式必须在字符串的末尾结束字符串。

那么,试试这个:

^[(]*\d{3}[)]*\s*[.\-\s]*\d{3}[.\-\s]*\d{4}$

【讨论】:

  • 但是,它没有任何好处,因为它不会“获取”数字。
  • (^[(]*\d{3}[)]*\s*[.\-\s]*\d{3}[.\-\s]*\d{4}$) 将表达式包装在捕获组中将允许您获取与正则表达式匹配的数字,并且不会对不匹配的数字执行任何操作。不过,我不确定您想如何获取这些数字,因此我的回答可能仍然不足以完成您的最终任务。您应该编辑您的问题并提供有关您的用例的更多详细信息。
  • @CameronRoe - 这已经完成了。添加了更多上下文以提高问题的清晰度
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-02
  • 2016-04-08
  • 2011-06-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多