【问题标题】:Match two whole words in Regex匹配正则表达式中的两个完整单词
【发布时间】:2013-04-25 22:17:14
【问题描述】:

我正在努力寻找使用正则表达式匹配两个连续的完整单词的解决方案。我有一个文本框,用户可以在其中输入他们的搜索条件,并用引号括起来以进行精确匹配。然后引号和空格(如果有)被 RegEx 表达式替换。这是一个例子:

用户输入:“苹果橙”

转换为:

\bApple\W+(?:\w+\W+){1,6}?Orange\b

然后,我的 RegEx 匹配将基于此转换后的标准。说明来自 www.regular-expressions.info/near.html

也许我的做法完全错误?我正在使用视觉工作室。任何帮助表示赞赏。

【问题讨论】:

  • 您使用什么语言?您可以在 C# 中使用 String.ContainsString.IndexOf 之类的东西,而不是正则表达式。
  • 我使用 RegEx 是因为它能够匹配整个单词,我不确定 String.Contains 或 String.IndexOf 是否可以做到这一点?
  • 您可以通过在开头和结尾附加一个空格来搜索整个单词,尽管在您的情况下,如果我理解正确的话,它更像是搜索一个短语。
  • 添加额外空格的好点,简单方便的解决方案!

标签: regex visual-studio-2010


【解决方案1】:

如果您想在用户使用引号时完全匹配,那么您应该删除引号并进行直接字符串比较(相等,不包含)

更新:

基于下面的 cmets,您只需执行与单个单词匹配相同的操作:

单字:

\bApple\b

双字

\bApple Orange\b

这个想法是用户输入搜索词并且你完全匹配,所以你不会对词本身进行模式匹配,只是它的边界(\b 包裹它)。没有理由触及搜索词本身(Apple 和 Orange 之间的所有你试图做的东西),因为即使两者之间的空间也是他们搜索的一部分......除非你想要让它有点灵活..例如,如果用户输入"Apple[lots of space here]Orange" 只是将其计为一个空格,那么您可以这样做

\bApple\s+Orange\b

..但是你有点偏离了整个“完全匹配”的主题......

旁注:您在评论中说,对于“CrabApple OrangeCrush”,您不希望“Apple Orange”匹配。这就是您使用\b 字边界的原因。但如果是我,IMO 会允许它匹配。或者至少,提供某种选项以这种方式搜索它。

【讨论】:

  • 你能给我一个使用相等而不是包含的简单例子吗?
  • 这取决于您使用的语言,但通常是双等号 ==,如 if (a==b) { // a is equal to b }
  • 这也取决于您搜索的内容..这是数据库查询吗?那么通常它只是一个等号,因为select column from table where column='search term' 将是一个精确匹配查找
  • 这是我的疏忽:输入的搜索条件与正文进行比较;因此,在纯粹相等的基础上将搜索条件与搜索主体进行比较将不会返回匹配项。在 RegEx 中,我可以通过说 \bApple\b 进行搜索,如果它找到整个单词“Apple”,它只会返回匹配项。但是,我不知道找到整组单词的正确语法(或替代解决方案),例如。 “苹果橙”。使用大多数字符串比较,如果存在“CrabApple OrangeCrush”,将返回匹配项,这不是我所希望的。
  • 好的,那么它仍然是一样的......只是\bApple Orange\b
猜你喜欢
  • 2010-11-15
  • 2012-01-06
  • 1970-01-01
  • 2011-12-16
  • 2011-08-07
  • 2017-07-08
相关资源
最近更新 更多