【问题标题】:Regex logical AND?正则表达式逻辑与?
【发布时间】:2017-01-13 10:29:00
【问题描述】:

我想写一个匹配的正则表达式:。

[\d]{6,}

( = 6 个连续数字) 但这不匹配:

0[\d]{9}

(以0开头的10个连续数字)

显然,我可以通过 2 个 C# 条件轻松完成。 if( Regex1.Match(pattern) && ! Regex2.Match(pattern) ) 但在我的代码的特定情况下,我需要通过一次检查来评估两者。

我想知道是否有办法用一个正则表达式检查这两个条件?

我需要的具体例子:

blabla

12345678 should be found

0123456789 should not be found

0123456 should be found

40666666666 should be found

bla

提前致谢。

EDIT : 编辑了预期的匹配

【问题讨论】:

  • 请提供真实的测试用例。目前尚不清楚这些数字块出现在什么上下文中。实际上,我认为您可以尝试使用众所周知的技术来匹配您不需要的内容并捕获您需要的内容:0\d{9}|(\d{6,})。你的最终目标是什么?
  • 您的意思是 6 位 还是 10 位(从零开始) 在一个唯一的正则表达式中?
  • @WashingtonGuedes:OP 提到了 C#。
  • @A.D.:如果您将数字作为单个字符串进行检查,您也可以使用^(?!0\d{9}$)\d{6,}$
  • 然后显示你正在使用的代码。如果你可以切换到 PCRE.NET,你可以使用\b0\d{9}\b(*SKIP)(*F)|\d{6,}。但是,我认为您应该能够通过我分享的方法使用本机 C# 正则表达式代码。

标签: regex


【解决方案1】:

你必须以一种方式编写你的正则表达式,所有条件都在一个正则表达式中。

例如,您可以使用boundaries (\b) 来表示您的字符串在您的数字后面有其他内容(字母、符号或空格),在您的数字之前有其他内容,以及alternation 的功能(管道) 给出一些“从 0 开始”的特殊说明:

\b(0\d{5,8}|0\d{10,}|[1-9]\d{5,})\b

示例:https://regex101.com/r/YIJh9g/4

但是,正如有人指出的那样:请举一个真实世界的例子。

【讨论】:

  • 嗨 Swe,我认为您错过了从找到的匹配项中排除以 0 开头的 10 位匹配项的要点。
  • 我更新了,和@WashingtonGuedes 的想法一样,请查看我的回答
  • @Washington Guedes \b(0\d{5,8}|0\d{10,}|\d{6,}) 几乎不错。但它与 0123456789 中的 012345678 匹配。试图排除它
  • 请查看我的回答
  • 我设法通过带负前瞻的零使其更简单。 \b((?!0\d{9}\b)\d{6,})\b.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多