【问题标题】:Find word using reg exp使用正则表达式查找单词
【发布时间】:2014-03-18 16:23:54
【问题描述】:

在包含数值的字符串中,例如:

6.1、6.1.1、6.1.2。

我想查找(并替换)整个单词 "6.1" 并忽略以 "6.1" 开头的其他单词。我尝试在我的 reg 表达式中使用 \b

Dim OrginalString as String  = "Sample text with numeric values starting with 6.1 followed by 6.1.1, 6.1.2 "
Dim wordToFind as String = "6.1"
Dim pattern As String = [String].Format("\b({0})\b", wordToFind)
Dim ret As String = Regex.Replace(OrginalString, pattern, "1234",RegexOptions.IgnoreCase)

但它会替换所有以"6.1" 开头的数字“单词”。结果如下:

ret = "Sample text with numeric values starting with 1234 followed by 1234.1, 1234.2 "

VB 或 C# 中的解决方案对我来说没问题。

成功了。 :) 谢谢 Casimir et Hippolyte!

【问题讨论】:

  • 欢迎来到 StackOverflow。如果某个答案对您有用,您应该将其标记为有帮助(通过单击它旁边的向上箭头)和/或正确(通过单击它旁边的复选标记)。
  • 在不知道whole word 的含义的情况下无法执行此操作。与您不想匹配的内容有何区别?
  • 如果要重新定义单词的含义,就不能使用单词边界(\b)。
  • 这些是逗号分隔的字段吗?如果是这样,它应该是Dim pattern As String = [String].Format("(?<=,|^)({0})(?=,|$)", wordToFind) 其他任何东西最终都会失败。没关系,阅读其余部分。
  • 因为您的模式包含正则表达式字符,所以它没有达到您的预期。它将愉快地匹配 6X1,因为点将匹配任何字符。如果您的模式中可能有正则表达式字符,您可能需要转义它们。或者,您是否考虑过 String.Replace()?

标签: c# regex vb.net


【解决方案1】:

您可以使用否定前瞻:

6\.1(?![.\d])

(?!...) 表示“不跟随”,只是一个检查,不是匹配结果的一部分。

注意:\b 仅相对于\w 字符类,由于. 不在该类中,1.2 之间存在单词边界6.1.2

您可以添加一个lookbehind以确保您的号码前面有一个空格或字符串的开头,例如:

(?<=^|\s)6\.1(?![.\d])

或前面不带数字或点:

(?<![.\d])6\.1(?![.\d])

【讨论】:

  • 是的,你是对的 :( 如果我在字符串中使用 66.1 而不是 6.1,则结果是“示例文本,其数值以 61234 开头,后跟 6.1.1、6.1.2”。如何替换任何数值,例如 6.1 或 66.1 或 666.1.1
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-30
  • 2022-08-18
  • 2023-03-25
  • 1970-01-01
相关资源
最近更新 更多