【问题标题】:Regex to capture an exact word in a sentence正则表达式捕获句子中的确切单词
【发布时间】:2016-03-14 12:02:12
【问题描述】:

我在捕获句子中的特定字符串时遇到了一些麻烦。

我使用的正则表达式是 \b[0-9]{9,12}\b 来捕获 9 到 12 位数字之间的数字。我使用它来指定确切数字的边界,但问题是,例如,当我有一个与此正则表达式匹配的数字后跟一个点时,正则表达式仍然匹配并给我带来很多麻烦。

在我搜索时,问题是\b 也使用了一些特殊字符作为分隔符,对吧?那么有没有办法考虑,例如 123456789. 整个字符串和正则表达式将与该示例不匹配?

谢谢!

【问题讨论】:

  • 你可以使用\b(?<!\.)[0-9]{9,12}(?!\.)\b
  • 我刚刚删除了“
  • 为什么要用(?!\.) 替换(?<!\.)?这是没有意义的,因为数字不能是点。必须是\b(?<!\.)[0-9]{9,12}(?!\.)\b
  • 这只是一个问题,因为我使用的是在线正则表达式测试器,它在这一点上指责错误。
  • 您应该使用 .NET 兼容的在线测试仪:regexhero.net、regexstorm.net 等。或者使用 Ultrapico Expresso(一个免费工具,可以在 regex101.com 上解释模式)。

标签: c# regex


【解决方案1】:

字边界\b 要求数字前后有一个非字字符(因为数字是一个 字符)。由于点和逗号是非单词字符,因此它们是允许的。为了确保点之间的数字序列不匹配,您需要使用lookarounds

你可以使用

\b(?<!\.)[0-9]{9,12}(?!\.)\b

regex demo

额外的子模式是后视 (?&lt;!\.) 和前瞻 (?!\.),它们确保在数字序列之前和之后没有 .

如果您有 ., 作为小数分隔符,您可能需要将模式调整为

\b(?<![.,])[0-9]{9,12}(?![.,])\b

【讨论】:

  • 非常感谢 Wiktor 的解释!它有效!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-01
  • 2017-06-27
  • 1970-01-01
相关资源
最近更新 更多