【问题标题】:REGEX: How to capture a certain string of numbers using regex but not when the sting is in the text of a URL?正则表达式:如何使用正则表达式捕获特定的数字字符串,但当字符串位于 URL 文本中时不捕获?
【发布时间】:2021-05-18 20:52:37
【问题描述】:

很长一段时间以来,我一直在尝试为这个问题找出一个正则表达式,但没有成功,所以我正在寻求一些帮助。 我创建了一个正则表达式,当它们出现在电子邮件中时,它将捕获特定的数字字符串。问题在于,当它们位于 URL 中时,它还会捕获这些特定的数字字符串。 URL 是随机生成的,而且很多时候,它们包含一串与我的正则表达式匹配的数字。我一直在尝试创建一个正则表达式,它仍将捕获特定的数字字符串,但当它位于 URL 内但没有运气时会忽略该字符串。这是我一直在使用的正则表达式的示例。

    (?:700[0-9][0-9]{7}|81[0-9][0-9][0-9]{5}|9999[0-9]{8})\b

这是一个包含特定字符串的电子邮件示例。

https://test.test.test.outlook.com/?url=bunchofrandomstuffthatdoesnotmatterF&data=sfsfsdagfd4454366474retre45435700000000%7CRegex%randomthingsoiMC4wLjAwnotareallink2luMzIiLCJBTiIjfsdkljafdslflsdkajfljie

mailto:发件人:发送时间:2021 年 5 月 17 日星期一上午 11:42 收件人:700000000。如果收到” 检测到:外部收件人,

https://test.test.test.outlook.com/?url=bunchofrandomstuffthatdoesnotmatterF&data=sfsfsdagfd4454366474retre45435700000000%7CRegex%randomthingsoiMC4wLjAwnotareallink2luMzIiLCJBTiIjfsdkljafdslflsdkajfljie

问题在于它捕获了构成 URL 的文本中的数字和 mailto 行中的数字。如果可能的话,我需要一个正则表达式来捕获满足电子邮件中任何地方正则表达式条件的数字字符串,除非它位于 URL 内。

我已经尝试了以下

(?:700[0-9][0-9]{7}|81[0-9][0-9][0-9]{5}|9999[0-9]{8} )\b(?:(?!https://test.test.test.outlook.com).)

它也不起作用。有什么想法吗?

【问题讨论】:

  • 试试这个https?://\S*(?:700[0-9][0-9]{7}|81[0-9][0-9][0-9]{5}|9999[0-9]{8})\b(*SKIP)(*F)|(?:700[0-9][0-9]{7}|81[0-9][0-9][0-9]{5}|9999[0-9]{8})\bregex101.com/r/rv29Tt/1
  • 非常感谢。这比我一直在努力做的要好得多。唯一的事情是,当我尝试将其复制到新的 regex101 中时,它抱怨 / 说必须用反斜杠转义未转义的定界符。我不知道为什么,因为我已尽力使所有设置都相同。
  • 在代码中解决了吗?在左上角的 regex101 上,您可以将分隔符更改为 / 以外的其他分隔符您也可以转义正斜杠,如 regex101.com/r/VzCe9b/1
  • 是的,代码有效,我想考虑回答这个问题。感谢您的帮助。你如何回答这个问题。
  • 如果您想接受答案,可以点击答案左侧的✓。

标签: regex string url boost


【解决方案1】:

Boost 支持 Perl 正则表达式语法,您可以从中利用回溯控制动词 (*SKIP)(*FAIL)

由于 url 是随机生成的,而不是排除 https://test.test.test.outlook.com,您可以匹配 http://https:// 后跟 0 个或多个非空白字符,使用 \S* 排除匹配 url。

那么你可以在交替|之后使用相同的模式

注意,对于当前的示例数据,问题中的模式不匹配。我在 700000000 中添加了 2 个零,以便在示例数据中获得匹配。

\bhttps?://\S*(?:700[0-9][0-9]{7}|81[0-9][0-9][0-9]{5}|9999[0-9]{8})\b(*SKIP)(*F)|(?:700[0-9][0-9]{7}|81[0-9][0-9][0-9]{5}|9999[0-9]{8})\b

查看regex demo

【讨论】:

  • 很抱歉再次提出这个问题,但是 (*SKIP)(*FAIL) 有什么替代方法吗?我问的原因是微软没有验证这些动词,尽管他们说他们使用 boost 进行正则表达式。
  • 在这种情况下,您可以匹配第一部分,而不是使用跳过失败,您可以使用捕获组。
猜你喜欢
  • 2023-01-17
  • 2012-08-20
  • 2022-01-17
  • 1970-01-01
  • 2023-01-10
  • 2019-10-10
  • 1970-01-01
  • 2016-12-15
  • 1970-01-01
相关资源
最近更新 更多