【问题标题】:REGEX for search and exclude combined用于搜索和排除组合的 REGEX
【发布时间】:2021-02-05 07:49:22
【问题描述】:

概述:

我正在尝试将两个 REGEX 查询合并为一个:

  • \d+\.\d+\.\d+\.\d+
  • ^(?!(10\.|169\.)).*$

我把它写成一个两部分的查询。第一部分将在文本块中隔离 IP,在我复制并粘贴后,我选择所有内容,而不是 10 或 169。

问题:

好像我把这个复杂化了:

  • 有人能找到更好的方法吗?
  • 有没有办法将这两个查询结合起来?

【问题讨论】:

  • 如果您需要从较大的文本中提取特定 IP,请尝试 \b(?!(?:10|169)\.)\d+\.\d+\.\d+\.\d+\b
  • @WiktorStribiżew 这应该作为答案发布(尽管对于了解正则表达式语法的人来说这很简单,但将来可能对其他人有用)。
  • @WiktorStribiżew 这也有效,谢谢伙计!
  • 如果您发现 Bohemian 的解决方案有效,不知道它是如何工作的。这些是在不同上下文中使用的不同正则表达式模式。
  • 我无法发布答案,我女儿没睡。

标签: regex


【解决方案1】:

当然。只需将锚定的负面展望放在开头即可:

^(?!10\.|169\.)\d+\.\d+\.\d+\.\d+$

注意:不必要的括号已被删除。


在一行内匹配,即移除锚点并使用“单词边界”\b作为锚点:

\b(?!10\.|169\.)\d+\.\d+\.\d+\.\d+

【讨论】:

  • 其实我撒了谎(对不起)这在 IP 列表上效果很好,但对于包含 IP 的段落格式,应该使用这样的东西:\b(?!(?:10|169)\.)\d+\.\d+\.\d+\.\d+\b
  • @rob 答案已编辑。如果你愿意,你可以删除尾随的\b
【解决方案2】:

一个快速且给我正则表达式风格的答案

Basic 一个(整个字符串看起来像一个 IP):^\d+\.\d+\.\d+\.\d+$

Lite(句点分隔的 4 位数字块,一个完整的单词):\b\d+\.\d+\.\d+\.\d+\b

Medium(不包括像1.2.4.6.7.9.0这样的垃圾):(?<!\d\.)\b\d+\.\d+\.\d+\.\d+\b(?!\.\d+)

Advanced 1(不以10169开头):(?<!\d\.)\b(?!(?:1(?:0|69))\.)\d+\.\d+\.\d+\.\d+\b(?!\.\d+)

Advanced 2(不以810结尾):(?<!\d\.)\b\d+\.\d+\.\d+\.(?!(?:8|10)\b)\d+\b(?!\.\d+)

求知详情

\b 是一个word boundary,它可以匹配较长文本中的精确“单词”(由[a-zA-Z0-9_] 字符组成的实体)。所以,如果我们不想在g12.12.23.56g 中匹配12.12.23.56,我们使用Lite 版本。

lookarounds 加上单词边界,可以进一步限制匹配。 (?<!\d\.) - 一个否定的lookbehind - 和一个(?!\.\d+) - 一个否定的lookahead - 如果类似IP 的子字符串前面有digit+. 或后面有.+digit,则匹配失败.因此,我们不会将12.12.34.56.78.90899 类似的实体与此正则表达式匹配。为这种情况选择 Medium 正则表达式。

现在,您需要将匹配限制为不以某个数值开头的匹配。您需要使用lookbehindlookahead在后视或前瞻解决方案之间进行选择时,更喜欢前瞻,因为 1) 它消耗资源较少,并且 2) 支持它的版本更多。 因此,如果 IP 首个数字相等,则所有匹配都会失败对于10169,我们可以使用否定前瞻锚定 引导词边界(?!(?:1(?:0|69))\.)。语法是(?!...),在内部,我们匹配1,后跟0,然后是.,或者1,后跟69,然后是.。请注意,我们可以写(?!10\.|169\.),但是会有一些多余的回溯开销,因为1 部分正在重复。最佳做法是“收缩”交替,使每个分支的开头不重复,使交替组更加线性。因此,请使用 Advanced 1 正则表达式版本来获取这些 IP。

一个类似的例子是 Advanced 2 正则表达式,用于获取一些不以某个值结尾的 IP。

【讨论】:

  • 这太棒了!感谢您花时间深入解释这一点并引用我可以阅读的来源!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-12
  • 2021-09-09
  • 2020-08-13
  • 1970-01-01
  • 2016-07-21
相关资源
最近更新 更多